我有一个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
,但是如何有效地完成上述任务?
答案 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']