假设我有一个列表的列表,例如
example_list = [[0, 0], [0, 1], [0, 1], [5, 4]]
我需要一种相当快的方法来获得一个列表,该列表只由在原始列表中至少出现两次的元素组成。在本例中,新列表将是
new_list = [[0, 1]]
,因为[0,1]是唯一重复的条目。我花了很多时间在Stackoverflow上寻找解决方案,但他们似乎都不适合我(详情如下)。在这种情况下,我该如何处理?
失败。一个可行的解决方案是写一些像
这样的东西new_list = [x for x in example_list if example_list.count(x) > 1]
然而,这对于我的目的来说太慢了。
另一个解决方案(此处建议)是写
totals = {}
for k,v in example_list:
totals[k] = totals.get(k,0) + v
totals.items()
[list(t) for t in totals.items()]
print(totals)
我可能误解了作者的意思,但这对我来说根本不起作用:它在终端中打印{0: 2, 5: 4}
。
最后一个解决方案(也在本页建议)是从集合中导入Counter并写入
new_list = Counter(x for x, new_list in example_list for _ in xrange(new_list))
map(list, new_list.iteritems())
这标记了xrange和iteritems上的错误(我认为这是Python3的事情?),所以我尝试了
new_list = Counter(x for x, new_list in example_list for _ in range(new_list))
map(list, new_list.items())
又得到了Counter({5: 4, 0: 2})
() !!),这当然不是我想要的……
您可以使用Counter
创建example_list
中元素计数的字典。但是每个元素都应该转换为tuple
以使其可哈希。然后,您可以过滤满足条件的元素。
from collections import Counter
d = Counter([tuple(x) for x in example_list])
[list(k) for k, v in d.items() if v >= 2]
# [[0, 1]]
可以计算内部列表的值。首先是迭代列表——但实际上你想迭代外部列表的值。itertools.chain.from_iterable
这是否适合你。在collections.Counter
中输入它,您将获得所有值的计数。列表推导式可以选择所需的值,然后将其放在外部列表中。
>>> example_list = [[0, 0], [0, 1], [0, 1], [5, 4]]
>>> import collections
>>> import itertools
>>> counts = collections.Counter(itertools.chain.from_iterable(example_list))
>>> counts
Counter({0: 4, 1: 2, 5: 1, 4: 1})
>>> selected = [k for k,v in counts.items() if v >= 2]
>>> result = [selected]
>>> result
[[0, 1]]