Програма проверки на дубликат
В качестве входных данных у вас есть список строк. Напишите метод double_string() для подсчета количества строк из списка, представленного в виде конкатенации двух строк из этого списка аргументов.
Несколько примеров:
| Тест | Результат |
|---|---|
| data = ['aa', 'aaaa', 'abc', 'abcabc', 'qwer', 'qwerqwer'] print(double_string(data)) | 3 |
| data = ['aa', 'abc', 'qwerqwer'] print(double_string(data)) | 0 |
Моя программа не работает должным образом, также я хочу посмотреть, как я могу ее решить, используя регулярные выражения(import re).
def double_string(data):
count = 0
for i in range(len(data)):
for j in range(i, len(data)):
if data[i] + data[j] in data:
count += 1
return count
Также мой код не проходит такие тесты:
Ответы (1 шт):
Два теста. Один ваша программа обработает верно, второй провалит:
['a', 'b', 'ab'] -> 1 # всё верно ['b', 'a', 'ab'] -> 0 # должно быть 1
В последнем примере ваша программа не посчитает что ab можно составить конкатенацией b и a, пусть и в обратном порядке.
Ещё один неработающий пример:
['a', 'b', 'ab', 'ab'] -> 1 # должно быть 2
В этом примере две последние строки можно представить конкатенацией, а вы считаете только одну.
Поправить можно так: строим множество всех возможных конкатенаций, каждый элемент списка проверяем на принадлежность этому множеству:
def double_string(data):
# множество всех возможных конкатенаций
s = set()
for v1 in data:
for v2 in data:
s.add(v1 + v2)
# сколько элементов списка найдутся в множестве конкатенаций?
c = 0
for v in data:
if v in s:
c += 1
return c
Если вы понимаете работу кода выше, то вот вам тоже самое только на настоящем Питоне.
itertools.product(..., repeat=2) строит все пары.
map(''.join, ...) конкатенирует элементы пар - делает строки.
sum(1 for ...) - способ сосчитать элементы. В Питоне нет функции которая считает длину генератора, это общепринятый заменитель.
def double_string(data):
s = set(map(''.join, itertools.product(data, repeat=2)))
return sum(1 for v in data if v in s)