Sho*_*u93 1 python iteration dictionary
嘿,我对以下我编写的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)
Run Code Online (Sandbox Code Playgroud)
在字典压缩方法中,"for i in list"是提供给方法的序列吗?所以它需要1,2,3,4 ..作为键.我的问题是为什么不花1次?因为我已经说过"for i in list",所以不必将列表中的每个元素都作为键吗?
(我是python的新手,所以对我来说很容易!)
我的问题是为什么不花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})
Run Code Online (Sandbox Code Playgroud)
是的,你的怀疑是正确的.1在迭代期间会出现3次.但是,由于字典具有唯一键,因此每次1出现时它将用新生成的键/值对替换先前生成的键/值对.这将给出正确的答案,它不是最有效的.您可以将列表转换为集合,以避免重新处理重复键:
dict = {i: list.count(i) for i in set(list)}
Run Code Online (Sandbox Code Playgroud)
然而,即使这种方法效率也非常低,因为它对列表中的每个值进行了完整的传递,即O(n²)总比较.您可以在列表中的一次传递中执行此操作,但您不会使用字典理解:
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
Run Code Online (Sandbox Code Playgroud)
结果counts是:{1: 3, 2: 3, 3: 2, 4: 1, 5: 2, 6: 1}
编辑:我没有意识到图书馆里有东西要为你做这件事.你应该使用Rohit Jain的解决方案collections.Counter.