计算嵌套列表中的元素出现次数

时间:2012-08-06 13:38:43

标签: python list counter

这可能是一个非常直截了当的问题,但我无法在其他地方找到答案,所以我会问。 查找元素在嵌套列表中出现的次数的最佳方法是什么? 例如:

my_list=[[a,b,c,d],[a,b,z,d],[a,c,f,e],[d,w,f,a]]

我如何找到'a'是列表中第一个元素的次数?或者更一般地说,my_list中出现多少次'a'?我想有一种方法可以用collections.Counter来做到这一点,但是我还没弄清楚。

修改 对于my_list,我希望计算a:3的输出,如果它是列表的第一个元素。如果问题已更改为查看b是否为第二个元素,则所需的输出将为b:2

3 个答案:

答案 0 :(得分:11)

使用嵌套的生成器表达式:

Counter(x for sublist in my_list for x in sublist)

要计算第一个位置的项目,不同的生成器表达式会获取该项目进行计数:

Counter(sublist[0] for sublist in my_list)

演示:

>>> from collections import Counter
>>> my_list=[['a','b','c','d'],['a','b','z','d'],['a','c','f','e'],['d','w','f','a']]
>>> Counter(x for sublist in my_list for x in sublist)
Counter({'a': 4, 'd': 3, 'c': 2, 'b': 2, 'f': 2, 'e': 1, 'w': 1, 'z': 1})
>>> Counter(sublist[0] for sublist in my_list)
Counter({'a': 3, 'd': 1})

答案 1 :(得分:3)

from collections import Counter
from itertools import chain

counts = Counter(chain.from_iterable(my_list))

或生成新列表并使用count:

new_list = list(chain.from_iterable(my_list))
print new_list.count(whatever)

如果你想要'a'是第一次多少次,那么就像:

sum(1 for el in my_list if el[0] is a) # or == a if object identity is not required

答案 2 :(得分:1)

>>> from collections import defaultdict, Counter
>>> my_list = [['a', 'b', 'c', 'd'], ['a', 'b', 'z', 'd'], ['a', 'c', 'f', 'e'], ['d', 'w', 'f', 'a']]
>>> pos_count = defaultdict(Counter)
>>> for sublist in my_list:
        for i, c in enumerate(sublist):
            pos_count[c][i] += 1


>>> pos_count['a'][0]
3
>>> pos_count['b'][1]
2