1

嘿,我对我编写的以下 python 代码有疑问:

#create a list of elements
#use a dictionary to find out the frequency of each element
list = [1,2,6,3,4,5,1,1,3,2,2,5]
list.sort()
dict = {i: list.count(i) for i in list}
print(dict)

在字典压缩方法中,“for i in list”是提供给方法的序列吗?所以它需要 1,2,3,4.. 作为键。我的问题是为什么不需要 1 三次?因为我已经说过“for i in list”,所以它不是必须将列表中的每个元素都作为键吗?

(我是 python 新手,所以请放轻松!)

4

2 回答 2

8

我的问题是为什么不需要 1 三次?

那是因为字典键是唯一的。如果为同一个键找到另一个条目,则该键的先前值将被覆盖。

好吧,对于您的问题,如果您只是在计算列表中每个元素的频率之后,那么您可以使用集合。Counter

请不要list用作变量名。它是内置的。

>>> lst = [1,2,6,3,4,5,1,1,3,2,2,5]
>>> from collections import Counter
>>> Counter(lst)
Counter({1: 3, 2: 3, 3: 2, 5: 2, 4: 1, 6: 1})
于 2013-08-19T16:45:22.633 回答
6

是的,你的怀疑是正确的。1在迭代过程中会出现 3 次。但是,由于字典具有唯一键,因此每次1出现时,它都会用新生成的键/值对替换先前生成的键/值对。这将给出正确的答案,它不是最有效的。您可以将列表转换为集合,以避免重新处理重复键:

dict = {i: list.count(i) for i in set(list)}

然而,即使这种方法也非常低效,因为它对列表中的每个值都进行了完整的遍历,即 O(n²) 总比较。您可以在列表中一次性完成此操作,但您不会使用 dict 理解:

xs = [1,2,6,3,4,5,1,1,3,2,2,5]
counts = {}
for x in xs:
  counts[x] = counts.get(x, 0) + 1

结果counts是:{1: 3, 2: 3, 3: 2, 4: 1, 5: 2, 6: 1}

编辑:我没有意识到图书馆里有东西可以为你做这件事。您应该改用 Rohit Jain 的解决方案collections.Counter

于 2013-08-19T16:45:25.697 回答