如何从列表中删除具有与同一列表中其他字符串相同的单词集合(按混杂顺序)的字符串

时间:2018-08-30 10:52:43

标签: python string python-3.x list

我有一个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 :(得分:1)

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 也必须相同,则应使用排序的集合。

答案 1 :(得分:0)

这应该有帮助。

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']

答案 2 :(得分:0)

您可以这样做:

 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']