如何计算无序列表中元素的频率?

新手上路,请多包涵

给定一个无序列表的值,例如

a = [5, 1, 2, 2, 4, 3, 1, 2, 3, 1, 1, 5, 2]

我怎样才能得到列表中出现的每个值的频率,像这样?

 # `a` has 4 instances of `1`, 4 of `2`, 2 of `3`, 1 of `4,` 2 of `5`
b = [4, 4, 2, 1, 2] # expected output

原文由 Bruce 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 382
2 个回答

如果列表已排序,您可以使用 groupby itertools 标准库中的 --- (如果没有,您可以先对其进行排序,尽管这需要 O(n lg n)时间):

 from itertools import groupby

a = [5, 1, 2, 2, 4, 3, 1, 2, 3, 1, 1, 5, 2]
[len(list(group)) for key, group in groupby(sorted(a))]

输出:

 [4, 4, 2, 1, 2]

原文由 Nadia Alramli 发布,翻译遵循 CC BY-SA 4.0 许可协议

在 Python 2.7(或更新版本)中,您可以使用 collections.Counter

 >>> import collections
>>> a = [5, 1, 2, 2, 4, 3, 1, 2, 3, 1, 1, 5, 2]
>>> counter = collections.Counter(a)
>>> counter
Counter({1: 4, 2: 4, 5: 2, 3: 2, 4: 1})
>>> counter.values()
dict_values([2, 4, 4, 1, 2])
>>> counter.keys()
dict_keys([5, 1, 2, 4, 3])
>>> counter.most_common(3)
[(1, 4), (2, 4), (5, 2)]
>>> dict(counter)
{5: 2, 1: 4, 2: 4, 4: 1, 3: 2}
>>> # Get the counts in order matching the original specification,
>>> # by iterating over keys in sorted order
>>> [counter[x] for x in sorted(counter.keys())]
[4, 4, 2, 1, 2]

如果您使用的是 Python 2.6 或更早版本,则可以 在此处 下载实现。

原文由 unutbu 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题