Програма проверки на дубликат

В качестве входных данных у вас есть список строк. Напишите метод 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 шт):

Автор решения: Stanislav Volodarskiy

Два теста. Один ваша программа обработает верно, второй провалит:

['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)
→ Ссылка