查找列表中仅出现一次的字符串索引的最有效方式是什么?
foo = ['it', 'does', 'it', 'very', 'very', 'well']
bar = ??? # bar = [1, 5]
我已经了解集合,词典和列表推导。我在这里试图解决的问题是在我的生产代码中我有并行数据列表,其中索引是许多因历史原因无法更改的索引。
答案 0 :(得分:3)
使用collections.Counter子类:
import collections
foo = ['it', 'does', 'it', 'very', 'very', 'well']
counts = collections.Counter(foo)
result = [i for i,v in enumerate(foo) if counts[v] == 1]
print(result)
输出:
[1, 5]
答案 1 :(得分:0)
你会得到你想要的。字典中的字典更快
from collections import Counter
foo = ['it', 'does', 'it', 'very', 'very', 'well']
d = dict(Counter(foo))
[i for i,v in enumerate(foo) if counts[v] == 1]
您也可以使用set(foo)
答案 2 :(得分:0)
你可以尝试这样的事情,特别是如果你的foo列表的大小比上面的例子大,并且有很多重复。
T
答案 3 :(得分:-2)
这取决于您希望获得的效率类型。你可以直接在列表理解中做到这一点,直截了当,可读:
bar = [index for index,el in enumerate(foo)if foo.count(el)== 1]
如果您想使用计数器
,请参阅this