基本上我有一个巨大的清单:
# with (n) being a number in the hundreds of thousands or millions
def big_list(n):
return [ randrange(n) for i in range(n) ]
我需要做的是创建一个新列表,其中仅包含big_list(n)
使用set
. 我真的被困住了,所以任何可以为我指明正确方向的东西都会很棒!
基本上我有一个巨大的清单:
# with (n) being a number in the hundreds of thousands or millions
def big_list(n):
return [ randrange(n) for i in range(n) ]
我需要做的是创建一个新列表,其中仅包含big_list(n)
使用set
. 我真的被困住了,所以任何可以为我指明正确方向的东西都会很棒!
l
Out[225]: [1, 2, 3, 45, 2, 2, 34, 5, 64, 5, 6, 45, 1, 1, 2, 3, 4, 6, 64, 3]
[x for x in l if l.count(x)==1]
Out[226]: [34, 4]
或使用集合中的 defaultdict,如果性能很重要:
In [228]: import collections
...: d = collections.defaultdict(int)
...: for x in l: d[x] += 1
...: results = [x for x in l if d[x] == 1]
...:
In [229]: results
Out[229]: [34, 4]
将计数存储在 dict 中并使用count==1
, dict 键过滤元素已经是唯一的。
[更新]
未经测试,请自行修复任何错误:
def filter_single_elements(big_list):
counter = {}
for element in big_list:
counter[element] = counter.get(element, 0) + 1
new_list = []
for element, count in counter.items():
if count == 1:
new_list.append(element)
return new_list
这将返回一个新列表。您可以尝试制作一个生成器:
def filter_single_elements_iter(big_list):
counter = {}
for element in big_list:
counter[element] = counter.get(element, 0) + 1
for element, count in counter.items():
if count == 1:
yield element
如果我理解正确,您只需要在大列表中只出现一次的项目。您可以这样做(x
您的清单在哪里):
>>> from collections import Counter
>>>
>>> x = [1, 1, 2, 3, 4, 5, 5, 6]
>>> y = []
>>>
>>> for item, count in Counter(x).most_common():
... if count == 1:
... y.append(item)
...
>>> y
[2, 3, 4, 6]
请注意,collections.Counter
仅 2.7+。
在 set 构造函数中使用生成器表达式:
def big_list(n):
return set(randrange(n) for i in xrange(n))
编辑
正如下面的评论所指出的,您寻找出现一次的元素。我建议你看看counter object。您可以使用它们来有效地计算大列表中的元素,而不是在柜台上进行迭代以筛选出您需要的元素。
将 big_list 转换为生成器并应用itertools 中的 unique_everseen 配方