Как удалить строки из списка, которые имеют тот же набор слов (в беспорядочном порядке), что и другие строки в том же списке - PullRequest
0 голосов
/ 30 августа 2018

У меня есть список строк в Python Например:

['abc xyz def','efg jk','apple','def abc xyz', 'orange', 'jk efg']

Я хочу удалить из этого списка повторяющиеся строки, которые имеют общие слова. Выход вышеупомянутого должен быть:

['abc xyz def','efg jk','apple','orange']

Я нашел collections.Counter(a) == collections.Counter(b), который может обнаружить такие duplicacy, но как эффективно выполнить вышеуказанную задачу?

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Хорошее решение предлагает библиотека toolz. Примечание toolz.unique эквивалентно рецепту unique_everseen, найденному в документах itertools:

from toolz import compose, unique

L = ['abc xyz def','efg jk','apple','def abc xyz', 'orange', 'jk efg']

res = list(unique(L, key=compose(frozenset, str.split)))

# ['abc xyz def', 'efg jk', 'apple', 'orange']

Композиция функций изначально не предлагается, но может быть заменена на lambda x: frozenset(x.split()). frozenset или отсортированная коллекция требуется, поскольку unique требует хешируемого ключа. Сортированная коллекция должна использоваться, если count слова также должно быть одинаковым.

0 голосов
/ 30 августа 2018

вы могли бы сделать:

 list( {' '.join(sorted(i.split())):i for i in l}.keys())
 ['abc def xyz', 'efg jk', 'apple', 'orange']

или

a = [' '.join(sorted(i.split())) for i in l]

list(dict(zip(a,a)))
 ['abc def xyz', 'efg jk', 'apple', 'orange']    

или

sorted(set(a), key=lambda x: a.index(x))
 ['abc def xyz', 'efg jk', 'apple', 'orange']
0 голосов
/ 30 августа 2018

Это должно помочь.

l = ['abc xyz def','efg jk','apple','def abc xyz', 'orange', 'jk efg']
c = tuple((i, " ".join(sorted(i.split()))) for i in l)
#(('abc xyz def', 'abc def xyz'), ('efg jk', 'efg jk'), ('apple', 'apple'), ('def abc xyz', 'abc def xyz'), ('orange', 'orange'), ('jk efg', 'efg jk'))


res = []
check_val = []
for k, v in c:
    if v not in check_val:
        res.append(k)
        check_val.append(v)
print(res)

Выход:

['abc xyz def', 'efg jk', 'apple', 'orange']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...