2017-06-22 52 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