使用字典计算列表中的项目[重复]

Posted

技术标签:

【中文标题】使用字典计算列表中的项目[重复]【英文标题】:Using a dictionary to count the items in a list [duplicate] 【发布时间】:2011-03-30 14:50:50 【问题描述】:

我是 Python 新手,我有一个简单的问题,比如我有一个项目列表:

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

将列表项添加到字典并计算该项在列表中出现的次数的最简单方法是什么。

所以对于上面的列表,我希望输出是:

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

【问题讨论】:

你可以在这里获得灵感:***.com/questions/2870466/python-histogram-one-liner ***.com/questions/13242103/… 有人注意到输出的顺序了吗?这无关紧要吗? 【参考方案1】:

在 2.7 和 3.1 中有一个特殊的 Counter dict 用于此目的。

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

【讨论】:

呸; Python 库中已经有足够的狭义膨胀了。 官方的说法,或者更确切地说是常设笑话,Guido 有一台时间机器.. @Glenn Maynard Counter 只是一个 multiset 的实现,它不是一个不常见的 IMO 数据结构。事实上,C++ 在 STL 中有一个名为 std::multiset(也称为 std::tr1::unordered_multiset)的实现,因此 Guido 并不是唯一一个认为其重要性的人。 @awesomo:不,它无法与 std::multiset 相提并论。 std::multiset 允许存储多个不同但相对相等的值,这就是它如此有用的原因。 (例如,您可以按温度比较位置列表,并使用多重集查找特定温度或温度范围内的所有位置,同时快速插入一组。)计数器仅计算重复次数;不同的值丢失。那用处要小得多——它只不过是一个包装好的字典。我质疑称其为多重集。 计数可能是一项狭窄的任务,但经常需要。【参考方案2】:

我喜欢:

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

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

【讨论】:

对于那些刚接触 python 的人。这个答案在时间复杂度方面更好。 这个答案甚至适用于浮点数列表,其中一些数字可能是'0' 这个答案也不需要任何额外的导入。 +1 很好的答案。 +1 我有兴趣看到这个的单行版本。 我不明白 +1 部分的作用。有人能解释一下吗?【参考方案3】:

只需使用列表属性计数\

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

输出:

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

【讨论】:

虽然有效,但似乎效率低下。 你能详细说明吗? 您对数组应用count 的次数与数组项的次数一样多。您的解决方案是O(n^2),其中更好的简单解决方案是O(n)。请参阅riviera's answer 上的 cmets 与 mmdreg's answer 上的 cmets。 也许你可以做d = x:i.count(x) for x in set(i)【参考方案4】:
>>> L = ['apple','red','apple','red','red','pear']
>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> for i in L:
...   d[i] += 1
>>> d
defaultdict(<type 'int'>, 'pear': 1, 'apple': 2, 'red': 3)

【讨论】:

@NickT 它比 itertools.Counter 更混乱 - 如果它更快,我会感到惊讶......【参考方案5】:

我一直认为,对于一个微不足道的任务,我不想导入任何东西。但我可能是错的,这取决于集合。计数器是否更快。

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 可能会在每次迭代时搜索整个事物。我使用这种方法解析了数兆字节的统计数据,而且速度总是相当快。

【讨论】:

您的答案很简单,值得更多称赞。我为此苦苦挣扎了一段时间,对其他一些建议导入新库等的愚蠢用户感到困惑。 你可以用这样的默认值来简化它 d[key] = d.get(key, 0) + 1 这个答案的简单性被低估了!有时不需要导入库和过度设计简单的任务。【参考方案6】:

考虑 collections.Counter(从 python 2.7 开始可用)。 https://docs.python.org/2/library/collections.html#collections.Counter

【讨论】:

【参考方案7】:

这个怎么样:

src = [ 'one', 'two', 'three', 'two', 'three', 'three' ]
result_dict = dict( [ (i, src.count(i)) for i in set(src) ] )

这会导致

'一':1,'三':3,'二':2

【讨论】:

请注意这是O(n^2),因为n 调用了src.count() 这真的是 O(n^2) 吗?给定 set(n) != n.【参考方案8】:
L = ['apple','red','apple','red','red','pear']
d = 
[d.__setitem__(item,1+d.get(item,0)) for item in L]
print d 

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

【讨论】:

以上是关于使用字典计算列表中的项目[重复]的主要内容,如果未能解决你的问题,请参考以下文章

列表中的c#字典[重复]

列表分配中的字典导致奇怪的输出[重复]

使用字典计算列表列表中的元素

字典列表中的列表理解[重复]

字典列表中的切片[重复]

迭代列表中的多个字典[重复]