1

可能重复:
如何使我的代码成为一个集合?
python获取列表并仅在使用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. 我真的被困住了,所以任何可以为我指明正确方向的东西都会很棒!

4

5 回答 5

4
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]
于 2012-10-14T22:25:21.517 回答
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
于 2012-10-14T22:15:03.750 回答
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+。

于 2012-10-14T22:25:24.733 回答
0

在 set 构造函数中使用生成器表达式:

def big_list(n):
    return set(randrange(n) for i in xrange(n))

编辑

正如下面的评论所指出的,您寻找出现一次的元素。我建议你看看counter object。您可以使用它们来有效地计算大列表中的元素,而不是在柜台上进行迭代以筛选出您需要的元素。

于 2012-10-14T22:11:48.680 回答
0

将 big_list 转换为生成器并应用itertools 中的 unique_everseen 配方

于 2012-10-14T22:26:28.363 回答