python使用set来创建只出现一次的元素列表

时间:2012-10-14 22:09:13

标签: python list python-2.7 set

  

可能重复:
  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元素。我真的被困住了所以任何可以指向正确方向的东西都会很棒!

5 个答案:

答案 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