我对以下代码感到有点困惑:
Python 2.7.13 (default, Jan 19 2017, 14:48:08)
[GCC 6.3.0 20170118] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> list_a = ['300', '300', '200', '150', '150', '120', '1']
>>> list_b = ['butter', 'sugar', 'yolks', 'flour', 'potato_starch', 'egg_whites', 'lemon_zest']
>>> c = dict(zip(list_b, list_a))
>>> print c
>>>{'butter': '300', 'lemon_zest': '1', 'flour': '150', 'egg_whites': '120', 'sugar': '300', 'yolks': '200', 'potato_starch': '150'}
>>> c = dict(zip(list_a, list_b))
>>> print c
>>>{'300': 'sugar', '200': 'yolks', '1': 'lemon_zest', '120': 'egg_whites', '150': 'potato_starch'}
为什么要颠倒列表,字典' c'失去两对成分:数量'? 我注意到最多6对都没问题 我为不完整的解释道歉,但我不知道如何向我解释这是一个异常 感谢谁愿意帮助我理解。
答案 0 :(得分:5)
反转参数的顺序意味着先前的字典值现在将优先作为键。
更重要的是,前一个字典具有重复值(例如300)。但是,一旦你交换了参数的顺序并且它们成为键,只有其中一个值使它成为新dict的键;字典不允许重复键。
答案 1 :(得分:2)
您有多个具有相同编号的项目,因此会覆盖该特定密钥的值。
{"a":300, "b":300}
将成为{300:"a", 300:"b"}
。由于密钥必须是唯一的,因此首先将“a”分配给密钥300来创建dict
,然后密钥300立即被“b”覆盖。
答案 2 :(得分:1)
查看您的数据结构,您可能对Counter
:
from collections import Counter
list_a = ['200', '300', '300', '200', '150', '150', '120', '1']
list_b = ['butter', 'butter', 'sugar', 'yolks', 'flour', 'potato_starch', 'egg_whites', 'lemon_zest']
ingredients = Counter()
for ingredient, quantity in zip(list_b, list_a):
ingredients[ingredient] += int(quantity)
print(ingredients)
# Counter({'butter': 500, 'sugar': 300, 'yolks': 200, 'flour': 150, 'potato_starch': 150, 'egg_whites': 120, 'lemon_zest': 1})
对于每种成分,当一个键出现不止一次时(例如'butter'
:200和300),它会对数量求和而不是覆盖值。
答案 3 :(得分:0)
d = dict(zip(list_a, list_b))
if len(d) != len(list_a):
d = dict(zip(list_b, list_a))
检查字典的长度,如果它不等于两个列表中某一个的长度,则颠倒'zip'的顺序