2013-03-19 147 views
1

如果你有三個列表映射字典和列表蟒蛇

list [1,2,3] [a,b,c] [5,6,7] 

與字典

{1:{'a':5}, 2:{'b':6}, 3:{'c':7}} 

有你必須使用壓縮的感覺映射它的最簡單的方法..

這將如何在python中完成,其中字典理解是不可能的

+4

字典是沒有順序。爲什麼不能得到結果?{1:{'b':6},2:{'a':5},3:{'c':7}}'? – gefei 2013-03-19 21:13:49

+0

詞典沒有秩序。你應該怎麼知道'1'帶有'{a:5}'? – mgilson 2013-03-19 21:13:51

+0

即使只有一次,感覺不錯@mgilson,即使只有2秒! – gefei 2013-03-19 21:14:29

回答

4

字典沒有一個訂單,所以我假設你想基於排序後的鍵的順序來映射它們。你可以做到這一點與以下:

>>> lst = [1, 2, 3] 
>>> dct = {'a': 5, 'b': 6, 'c': 7} 
>>> {i: {k: dct[k]} for i, k in zip(lst, sorted(dct))} 
{1: {'a': 5}, 2: {'b': 6}, 3: {'c': 7}} 

如果你決定使用類似的元組,而不是一本字典的列表,以維持秩序,你可以做到以下幾點:

>>> lst = [1, 2, 3] 
>>> tups = [('a', 5), ('b', 6), ('c', 7)] 
>>> {i: {k: v} for i, (k, v) in zip(lst, tups)} 
{1: {'a': 5}, 2: {'b': 6}, 3: {'c': 7}} 
+0

我相信輸入是三個列表和所需的輸出是一個字典映射他們所示的問題。 – martineau 2013-03-19 22:21:52

+1

我在OP編輯問題之前回答了問題,原始版本有一個字典代替第二個列表。 – 2013-03-19 23:54:19

6

的3-在更新列表的情況是容易的與zip

d = {k:{k1:v1} for k,k1,v1 in zip(list1,list2,list3)} 
0

是否可以被複制在第一&第二列表中的值,例如:

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

如果您需要的順序:

from collections import OrderedDict 
od = OrderedDict() 
for x, y, z in zip(a, b, c): 
    if x not in od: 
     od[x] = OrderedDict() 
    od[x][y] = z 
print od 

輸出:

OrderedDict([(3, OrderedDict([('a', 1), ('c', 7)])), (1, OrderedDict([('a', 5), ('d', 8)])), (2, OrderedDict([('b', 6)]))]) 

如果你不需要順序:

from collections import defaultdict 
dd = defaultdict(dict) 
for x, y, z in zip(a,b,c): 
    dd[x][y] = z 
print dd 

輸出:

defaultdict(<type 'dict'>, {1: {'a': 5, 'd': 8}, 2: {'b': 6}, 3: {'a': 1, 'c': 7}}) 
0

使用izip這是在輸出效率

from itertools import izip 

a = [1, 2, 3] 
b = ['a', 'b', 'c'] 
c = [5, 6, 7] 

print {a: {b: c} for a, b, c in izip(a, b, c)} 

方面更好:

{1: {'a': 5}, 2: {'b': 6}, 3: {'c': 7}}