for循环中的字典vs for循环中的字典?



嗨,我有一个关于遍历列表并将列表中的项及其频率添加到字典中的问题。

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

输出

{'pear': 4, 'apple': 2, 'red': 3}

然而

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

输出
{'pear': 4}

我需要遍历列表,同时将字典中的每次迭代添加到新列表中。然而,我不明白为什么这两种不同的代码会给出不同的结果。

令人鼓舞的是,计数函数在第二个问题上起作用了。但我不知道苹果和红消失到哪里去了。

很抱歉我的措辞不好等等,这几个小时一直在工作,快把我逼疯了。非常感谢你花时间帮助我

我很困惑为什么这两个结果不同

问题是您必须在第二个循环中添加key:value对,而不是在每个循环中覆盖d

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

将输出与第一个函数相同的结果。

{'pear': 4, 'apple': 2, 'red': 3}

基本上在你的第二个例子中,当你做d={x:i.count(x)}时,你有一个单元素字典,并且对于每个循环你都覆盖它。然后它只显示pear: 4,因为peari列表中的最后一个元素。

i = ['apple','pear','red','apple','red','red','pear', 'pear', 'pear']
d = {} 
log = []
for x in i: 
log.append({x:i.count(x)})

logis

[{'apple': 2},
{'pear': 4},
{'red': 3},
{'apple': 2},
{'red': 3},
{'red': 3},
{'pear': 4},
{'pear': 4},
{'pear': 4}]

我刚刚运行了你的第一个代码,它给了我

{'apple': 2, 'pear': 4, 'red': 3}

这是正确的,但与你在问题中所说的不同。

要处理你的第二比特代码,你在循环的每次迭代中执行赋值操作,所以每次访问i的新项时,d的值都会被重写

我个人建议使用Counter来解决这个问题:

>>> from collections import Counter
>>> z = ['blue', 'red', 'blue', 'yellow', 'blue', 'red']
>>> Counter(z)
Counter({'blue': 3, 'red': 2, 'yellow': 1})
varLs = ['apple','pear','red','apple','red','red','pear','pear','pear']
def frequency(varLs):  
counters = {}
for item in varLs:
if item not in counters:
counters[item] = 1
else:
counters[item]+= 1
return counters
print(frequency(varLs))

返回{'apple': 2, 'pear': 4, 'red': 3}

最新更新