2017-06-22 88 views
12

我的第一個想法是寫一個interator,或者做一些列表理解。但是,就像我用python編寫的每個5-10行方法一樣,有人通常可以指向我在標準庫中的調用來完成相同的操作。我怎樣才能用兩個元組來生成字典?

我怎麼能從兩個元組xy到一本字典z

x = (1, 2, 3) 
y = ('a', 'b', 'c') 

z = { } 
for index, value in enumerate(y): 
    z[value] = x[index] 

print z 

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

回答

20

元組是迭代。您可以使用zip將兩個或更多個迭代器合併爲兩個或更多元素的元組。

字典可以構造出的2元組可迭代的,因此:

#   v values 
dict(zip(y,x)) 
#  ^keys 

這產生:

>>> dict(zip(y,x)) 
{'c': 3, 'a': 1, 'b': 2} 

注意,如果兩個iterables具有不同長度,那麼zip將從當前的一個元組耗盡停止。

你可以 - 作爲@Wondercricket說 - 使用(在zip_longestizip_longestfillvalue:用來當iterables之一耗盡值:

from itertools import izip_longest 

dict(izip_longest(y,x,fillvalue=''))

因此,如果關鍵迭代首先耗盡,所有剩餘的值將映射到這裏的空字符串(因此只有最後一個將被存儲)。如果可迭代值先耗盡,則所有剩餘的鍵將映射到空字符串上。

+1

你擁有它倒退。它應該'(dict(y,x))'而不是'dict(zip(x,y))''。 –

+0

@ChristianDean:感謝您的評論。改性。 –

+1

*然後zip會從一個元組耗盡*的時刻開始停止。如果OP需要,可以使用[izip_longest](https://docs.python.org/2/library/itertools.html#itertools.izip_longest) – Wondercricket

5

您可以使用字典解析:

>>> {y[i]:x[i] for i,_ in enumerate(x)} 
{'a': 1, 'b': 2, 'c': 3} 
+0

如果'x'長於'y',這會怎麼辦?確切地說,'IndexError'。 – Mast

+0

如果你期望x和y的長度相同,zip方法也不會給你你想要的(它會默默地產生意想不到的結果,而不是錯誤)。這種方法非常簡單,而且您可能需要明確處理不同長度的鍵/值列表。 – mfrankli

+0

(雖然,一旦你知道「拉鍊意味着製作一本字典」的習慣用法,我想它是同樣可讀的。) – mfrankli