如果我颠倒了zip列表的顺序,为什么我会得到两个不同的词典

时间:2017-04-27 13:08:12

标签: python python-2.7 list dictionary

我对以下代码感到有点困惑:

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对都没问题 我为不完整的解释道歉,但我不知道如何向我解释这是一个异常 感谢谁愿意帮助我理解。

4 个答案:

答案 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'的顺序