2017-04-27 2 views
2

を逆ならば、私は次のコードによって少し困惑しています、二つの異なる辞書を入手できます:は、なぜ私はジップリストの順番

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」は2を失った理由ペア '成分:量'?
私は6組までが大丈夫だと気付いた。
不完全な説明をお詫びしますが、これを私に説明する方法が異常であるかどうかはわかりません。
誰が私を理解するのを助けてくれるのでしょうか。

+2

辞書キーの順序を逆はユニークである必要があります。 'list_a'からキーを作成すると、重複が含まれているので、そのキーに格納されている既存のデータを上書きします。 – roganjosh

答えて

5

引数の順序を逆にすると、以前の辞書値がキーとして優先されるようになります。

さらに、前の辞書の値が重複しています(例:300)。ただし、引数の順序を入れ替えてキーにすると、その値のうちの1つのみが新しいdictのキーとして使用されます。辞書は重複するキーを許可しません。

+0

ありがとうございました –

2

同じ番号のアイテムが複数あるため、その特定のキーの値が上書きされます。

{"a":300, "b":300}{300:"a", 300:"b"}になります。キーは一意でなければならないので、dictは最初に "a"をキー300に割り当てた後に "b"によって直ちに上書きされて作成されます。

+0

@tobias_k正確には、{"a":300、 "b":300}は{300: "a"、300: "b"}になります。 –

+0

ありがとう今私は理解している –

+0

@ EricDuminil:あなたは正しい、言葉の間違った選択。編集し、うまくいけば私のポイントを明らかにした。ありがとう! –

1

あなたのデータ構造を見ると、あなたがCounterに興味があるかもしれない:キーは'butter'と例えば(複数回出現する場合、各成分のための

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}) 

、それは代わりに値を上書きするの量を合計します:200および300)。

+0

ありがとう、私は二重の成分を持ってはならないが、あなたの統合は非常に便利です。 –

0
d = dict(zip(list_a, list_b)) 
    if len(d) != len(list_a): 
     d = dict(zip(list_b, list_a)) 

チェック辞書の長さと、それは二つのリストの1の長さと等しくない場合は、「郵便番号」

関連する問題