可能重复:
How can I make my code be a set?
python takes list and returns only if negative value also exists using 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
元素。我真的被困住了所以任何可以指向正确方向的东西都会很棒!
答案 0 :(得分:3)
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]
答案 1 :(得分:1)
将计数存储在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
答案 2 :(得分:1)
如果我理解正确,您只需要在大列表中出现一次的项目。您可以通过以下方式进行操作(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+。
答案 3 :(得分:0)
在set构造函数中使用生成器表达式:
def big_list(n):
return set(randrange(n) for i in xrange(n))
修改强>
正如评论所指出的那样,你会寻找出现过一次的元素。 我建议你看一下counter object。您可以使用它们来有效地计算大列表中的元素,而不是在柜台上迭代以筛选出您需要的元素。
答案 4 :(得分:0)
将big_list转换为生成器并应用the unique_everseen recipe from itertools