2016-07-14 39 views
0

我面對一些麻煩創建從列表中詞典和一個列表的列表。這裏有一個例子:創建從二維表的字典在Python

a = ['a','b','c','d'] 
b = [[1,2,0], [3,4,1], [5,6,0], [7,8,1]] 

我想用列表一個和列表b的第三個元素,這樣輸出的元素的輸出:

a = {'a': 0, 'b': 1, 'c': 0, 'd': 1] 

兩個列表具有相同的長度,所以我想是這樣的:

c = dict(zip(a,b)) 

但在這種情況下,我無法選擇B的第三元件。

在我的現實情況下,我有幾百萬個數據的,所以我需要一個快速和簡單的方法來做到這一點,並建立從B的臨時列表可能不是一個最佳的解決方案。

感謝

回答

2

你可以這樣做:

dict(zip(a, (x[-1] for x in b))) # Maybe x[2] if some of the sublists have more than 3 elements. 

如果您對python2.x,您可能需要使用itertools.izipfuture_builtins.zip

0

我已經試過這一個,它似乎已經工作:

>>> a = ['a','b','c','d'] 
>>> b = [[1,2,0], [3,4,1], [5,6,0], [7,8,1]] 
>>> c = dict(zip(a, [d[2] for d in b])) 
>>> c 
{'a': 0, 'c': 0, 'b': 1, 'd': 1} 
1

或者,使用comp rehension:

a = ['a','b','c','d'] 
b = [[1,2,0], [3,4,1], [5,6,0], [7,8,1]] 

c = {k: v[-1] for k, v in zip(a, b)} 

PEP274快譯通悟

0

可以使operator模塊內部使用的itemgetter。其中表示b子列表中的索引。

from operator import itemgetter 
a = ['a','b','c','d'] 
b = [[1,2,0], [3,4,1], [5,6,0], [7,8,1]] 

c = dict(zip(a, map(itemgetter(2), b))) 

因爲你有很多的元素,也許itertools將與記憶幫助:

from operator import itemgetter 
from itertools import izip, imap 

a = ['a','b','c','d'] 
b = [[1,2,0], [3,4,1], [5,6,0], [7,8,1]] 

c = dict(izip(a, imap(itemgetter(2), b))) 

這些解決方案將幫助利用底層的C模塊的性能優勢。