假设我有一个项目列表,像这样:

['apple', 'red', 'apple', 'red', 'red', 'pear']

我想要一个字典,计算每个项目在列表中出现的次数。所以对于上面的列表,结果应该是:

{'apple': 2, 'red': 3, 'pear': 1}

如何在Python中简单地做到这一点?


如果只对列表中单个元素的实例计数感兴趣,请参见如何计算列表项的出现次数?。


当前回答

如果你使用Numpy,唯一的函数可以通过传递return_counts=True来告诉你每个值出现了多少次:

>>> data = ['apple', 'red', 'apple', 'red', 'red', 'pear']
>>> np.unique(data, return_counts=True)
(array(['apple', 'pear', 'red'], dtype='<U5'), array([2, 1, 3]))

计数的顺序与发现的不同元素相同;因此,我们可以使用通常的技巧来创建所需的字典(将两个元素作为单独的参数传递给zip):

>>> dict(zip(*np.unique(data, return_counts=True)))
{'apple': 2, 'pear': 1, 'red': 3}

如果你有一个大的输入Numpy数组的小整数,你可以从bincount得到更好的性能:

>>> data = np.random.randint(10, size=100)
>>> data
array([1, 0, 0, 3, 3, 4, 2, 4, 4, 0, 4, 8, 7, 4, 4, 8, 7, 0, 0, 2, 4, 2,
       0, 9, 0, 2, 7, 0, 7, 7, 5, 6, 6, 8, 4, 2, 7, 6, 0, 3, 6, 3, 0, 4,
       8, 8, 9, 5, 2, 2, 5, 1, 1, 1, 9, 9, 5, 0, 1, 1, 9, 5, 4, 9, 5, 2,
       7, 3, 9, 0, 1, 4, 9, 1, 1, 5, 4, 7, 5, 0, 3, 5, 1, 9, 4, 8, 8, 9,
       7, 7, 7, 5, 6, 3, 2, 4, 3, 9, 6, 0])
>>> np.bincount(data)
array([14, 10,  9,  8, 14, 10,  6, 11,  7, 11])

输出数组中的第n个值表示n出现的次数,因此如果需要,可以使用enumerate创建字典:

>>> dict(enumerate(np.bincount(data)))
{0: 14, 1: 10, 2: 9, 3: 8, 4: 14, 5: 10, 6: 6, 7: 11, 8: 7, 9: 11}

其他回答

我一直认为,对于如此琐碎的任务,我不想导入任何东西。但我可能是错的,取决于收集。反击是否更快。

items = "Whats the simpliest way to add the list items to a dictionary "

stats = {}
for i in items:
    if i in stats:
        stats[i] += 1
    else:
        stats[i] = 1

# bonus
for i in sorted(stats, key=stats.get):
    print("%d×'%s'" % (stats[i], i))

我认为这可能比使用count()更好,因为它只会遍历可迭代对象一次,而count可能会在每次迭代中搜索整个对象。我使用这种方法解析了许多兆字节的统计数据,它总是相当快。

如果你使用Numpy,唯一的函数可以通过传递return_counts=True来告诉你每个值出现了多少次:

>>> data = ['apple', 'red', 'apple', 'red', 'red', 'pear']
>>> np.unique(data, return_counts=True)
(array(['apple', 'pear', 'red'], dtype='<U5'), array([2, 1, 3]))

计数的顺序与发现的不同元素相同;因此,我们可以使用通常的技巧来创建所需的字典(将两个元素作为单独的参数传递给zip):

>>> dict(zip(*np.unique(data, return_counts=True)))
{'apple': 2, 'pear': 1, 'red': 3}

如果你有一个大的输入Numpy数组的小整数,你可以从bincount得到更好的性能:

>>> data = np.random.randint(10, size=100)
>>> data
array([1, 0, 0, 3, 3, 4, 2, 4, 4, 0, 4, 8, 7, 4, 4, 8, 7, 0, 0, 2, 4, 2,
       0, 9, 0, 2, 7, 0, 7, 7, 5, 6, 6, 8, 4, 2, 7, 6, 0, 3, 6, 3, 0, 4,
       8, 8, 9, 5, 2, 2, 5, 1, 1, 1, 9, 9, 5, 0, 1, 1, 9, 5, 4, 9, 5, 2,
       7, 3, 9, 0, 1, 4, 9, 1, 1, 5, 4, 7, 5, 0, 3, 5, 1, 9, 4, 8, 8, 9,
       7, 7, 7, 5, 6, 3, 2, 4, 3, 9, 6, 0])
>>> np.bincount(data)
array([14, 10,  9,  8, 14, 10,  6, 11,  7, 11])

输出数组中的第n个值表示n出现的次数,因此如果需要,可以使用enumerate创建字典:

>>> dict(enumerate(np.bincount(data)))
{0: 14, 1: 10, 2: 9, 3: 8, 4: 14, 5: 10, 6: 6, 7: 11, 8: 7, 9: 11}

简单地使用列表属性count\

i = ['apple','red','apple','red','red','pear']
d = {x:i.count(x) for x in i}
print d

输出:

{'pear': 1, 'apple': 2, 'red': 3}

在2.7和3.1中,有特殊的Counter (dict子类)用于此目的。

>>> from collections import Counter
>>> Counter(['apple','red','apple','red','red','pear'])
Counter({'red': 3, 'apple': 2, 'pear': 1})

我喜欢:

counts = dict()
for i in items:
  counts[i] = counts.get(i, 0) + 1

.get允许您在键不存在时指定一个默认值。