【问题标题】:python dictionary comprehension iteratorpython字典理解迭代器
【发布时间】:2013-08-21 13:13:23
【问题描述】:

嘿,我对我编写的以下 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”,是不是要把list中的每一个元素都作为key?

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

【问题讨论】:

  • 顺便提一下,你应该看看collections.Counter

标签: python dictionary iteration


【解决方案1】:

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

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

好吧,对于您的问题,如果您只是在计算列表中每个元素的频率之后,那么您可以使用collections.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})

【讨论】:

    【解决方案2】:

    是的,你的怀疑是正确的。 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}

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

    【讨论】:

    • 感谢您的意见!问题是我的任务要求我使用字典来查找频率。所以我无法实现你提供的其他方法。
    猜你喜欢
    • 2019-04-01
    • 2015-09-21
    • 2013-12-03
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 2014-04-10
    相关资源
    最近更新 更多