Python字典理解迭代器(python dictionary comprehension iter

2019-10-18 12:58发布

嘿,我在下面的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)

在“在列表中对于i”的字典压缩方法,是提供给权方法的序列? 因此,需要1,2,3,4 ...作为关键字。 我的问题是,为什么不要花1个三倍? 因为我说:“因为我在名单”,是不是必须采取每一个元素在列表中的关键?

(我是新来的Python这样很容易对我!)

Answer 1:

是的,你的怀疑是正确的。 1迭代期间将拿出3倍。 然而,由于字典有独特的按键,每次1出现将取代先前产生的键/值对新生成的键/值对。 这将得到正确的答案,这不是最有效的。 您可以在列表转换为一组,而不是为了避免再处理重复键:

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

然而,因为它确实全传过来的列表在列表中,即,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

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

编辑:我不知道有什么东西在图书馆为你做这个。 您应该使用罗希特耆那教与解决方案collections.Counter代替。



Answer 2:

我的问题是,为什么不要花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})


文章来源: python dictionary comprehension iterator