我的数据如下所示:
let = ['a', 'b', 'a', 'c', 'a']
如何删除重复项?我希望我的输出是这样的:
['b', 'c']
当我使用该set
功能时,我得到:
set(['a', 'c', 'b'])
这不是我想要的。
我的数据如下所示:
let = ['a', 'b', 'a', 'c', 'a']
如何删除重复项?我希望我的输出是这样的:
['b', 'c']
当我使用该set
功能时,我得到:
set(['a', 'c', 'b'])
这不是我想要的。
一种选择是(源自 Ritesh Kumar在此处的回答)
let = ['a', 'b', 'a', 'c', 'a']
onlySingles = [x for x in let if let.count(x) < 2]
这使
>>> onlySingles
['b', 'c']
尝试这个,
>>> let
['a', 'b', 'a', 'c', 'a']
>>> dict.fromkeys(let).keys()
['a', 'c', 'b']
>>>
而不是每次都对主列表进行排序或线性扫描和重新计数。
计算出现次数,然后过滤出现一次的项目...
>>> from collections import Counter
>>> let = ['a', 'b', 'a', 'c', 'a']
>>> [k for k, v in Counter(let).items() if v == 1]
['c', 'b']
无论如何,您必须至少查看一次序列 - 尽管限制您这样做的次数是有意义的。
如果您真的想避免使用任何类型或set
其他散列容器(因为您可能无法使用它们?),那么是的,您可以对其进行排序,然后使用:
>>> from itertools import groupby, islice
>>> [k for k,v in groupby(sorted(let)) if len(list(islice(v, 2))) == 1]
['b', 'c']
对输入进行排序,然后删除重复项变得微不足道:
data = ['a', 'b', 'a', 'c', 'a']
def uniq(data):
last = None
result = []
for item in data:
if item != last:
result.append(item)
last = item
return result
print uniq(sorted(data))
# prints ['a', 'b', 'c']
这基本上是 shell 的cat data | sort | uniq
习惯用法。成本为 O(N * log N),与基于树的集合相同。