2013-04-05 93 views
4

我用這個代碼:以兩個列表在字典映射如何將多個列表映射到一個字典?

dictionary = dict(zip(list1, list2)) 

。其中:

list1 = ('a','b','c') 
list2 = ('1','2','3') 

字典等於:

{'a': 1, 'c': 3, 'b': 2} 

有沒有辦法來添加第三個列表:

list3 = ('4','5','6') 

,以便詞典將相等於:

{'a': [1,4], 'c': [3,5], 'b': [2,6]} 

第三個列表必須添加,以便它遵循現有的映射。

這個想法是使這個工作迭代地在一個for循環和幾十個值到正確映射關鍵字。 是這樣的可能嗎?

希望我的問題很清楚。

回答

11
dict((z[0],list(z[1:])) for z in zip(list1,list2,list3)) 

會工作。或者,如果你喜歡python2.7的略微更好的字典,語法的理解+

{z[0]:list(z[1:]) for z in zip(list1,list2,list3)} 

這可擴展到以列表的任意數量的容易:

list_of_lists = [list1,list2,list3,...] 
{z[0]:list(z[1:]) for z in zip(*list_of_lists)} 

如果你要轉換的類型,以確保該值列表中包含的所有整數:

def to_int(iterable): 
    return [int(x) for x in iterable] 

{z[0]:to_int(z[1:]) for z in zip(*list_of_lists)} 

當然,你可以做,在1號線,但我寧願不要。

+0

謝謝。這正是我需要的! – user1919 2013-04-05 12:50:19

5
In [12]: list1 = ('a','b','c') 

In [13]: list2 = ('1','2','3') 

In [14]: list3 = ('4','5','6') 

In [15]: zip(list2, list3) 
Out[15]: [('1', '4'), ('2', '5'), ('3', '6')] 

In [16]: dict(zip(list1, zip(list2, list3))) 
Out[16]: {'a': ('1', '4'), 'b': ('2', '5'), 'c': ('3', '6')} 

In [17]: dict(zip(list1, zip(map(int, list2), map(int, list3)))) 
Out[17]: {'a': (1, 4), 'b': (2, 5), 'c': (3, 6)} 

In [18]: dict(zip(list1, map(list, zip(map(int, list2), map(int, list3))))) 
Out[18]: {'a': [1, 4], 'b': [2, 5], 'c': [3, 6]} 

對於列出的任意號碼,你可以這樣做:

dict(zip(list1, zip(*(map(int, lst) for lst in (list2, list3, list4, ...))))) 

或者,使值列表而不是元組,

dict(zip(list1, map(list, zip(*(map(int, lst) for lst in (list2, list3, list4, ...)))))) 
+1

會這樣的事情可以修改,所以它適用於n個列表? – user1919 2013-04-05 12:43:47

+1

+1。我喜歡'dict(zip(keys,zip(values))''版本。特別是在python3.x中,zip是懶惰的。 – mgilson 2013-04-05 12:52:15

相關問題