如何使用两个元组生成一个字典?

23

我的第一反应是编写一个迭代器,或者使用列表推导式。但是,就像我在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 }
2个回答

38
元组是可迭代对象。您可以使用zip将两个或多个可迭代对象合并成两个或多个元素的元组。
可以从2元组的可迭代对象构建字典,因此:
#          v values
dict(zip(y,x))
#        ^ keys

这将生成:

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

请注意,如果这两个可迭代对象的长度不同,则zip将在一个元组耗尽时停止。您可以像@Wondercricket所说的那样,使用izip_longest(或在中使用zip_longest)和fillvalue,它是在可迭代对象之一用尽时使用的值。
<b>from itertools import izip_longest</b>

dict(<b>izip_longest(</b>y,x<b>,fillvalue='')</b>)

如果键的迭代器先耗尽,所有剩余的值都将映射到此处的空字符串中(因此只有最后一个将被存储)。如果值的迭代器先耗尽,则所有剩余的键都将映射到此处的空字符串上。

1
你搞反了,应该是 dict(zip(y, x)) 而不是 dict(zip(x,y)) - Christian Dean
@ChristianDean:感谢您的评论。已修改。 - Willem Van Onsem
1
如果其中一个元组耗尽,那么zip将停止。如果OP希望,可以使用izip_longest来处理此问题。 - Wondercricket
1
@Wondercricket:添加到答案中。 - Willem Van Onsem
3
注意:在Python 3中,“izip_longest”现在被简化为“zip_longest”。 - juanpa.arrivillaga

6
你可以使用字典推导式:
```python ```
>>> {y[i]:x[i] for i,_ in enumerate(x)}
{'a': 1, 'b': 2, 'c': 3}

如果 xy 更长,那么会发生什么?准确地说,会出现 IndexError - Mast
1
如果你期望x和y具有相同的长度,使用zip方法也无法给你想要的结果(它会悄悄产生意外的结果,而不是报错)。在我的观点中,这种方法更简单,并且你可能需要明确地处理不同长度的键值列表。 - mfsiega
尽管一旦你知道“zip意味着创建一个字典”的习语,我猜它同样易读。 - mfsiega

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接