【问题标题】:How can I take two tuples to produce a dictionary? [duplicate]如何获取两个元组来生成字典? [复制]
【发布时间】:2017-11-26 04:16:16
【问题描述】:

我的第一个想法是写一个交互器,或者做一些列表理解。但是,就像我在 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 }

【问题讨论】:

    标签: python dictionary tuples


    【解决方案1】:

    元组是可迭代的。您可以使用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:当其中一个可迭代对象为筋疲力尽:

    from itertools import izip_longest
    
    dict(izip_longest(y,x,fillvalue=''))

    所以如果 key iterable 首先被用完,所有剩余的值将被映射到这里的空字符串(所以只有最后一个会被存储)。如果值iterable先用完,这里所有剩余的key都会映射到空字符串上。

    【讨论】:

    • 你倒退了。它应该是 dict(zip(y, x)) 而不是 dict(zip(x,y))
    • @ChristianDean:感谢您的评论。已修改。
    • 然后 zip 将从其中一个元组用完的那一刻起停止。如果 OP 需要,可以使用izip_longest 处理
    • @Wondercricket:添加到答案中。
    • @WillemVanOnsem 注意:izip_longest 现在在 Python 3 中只是 zip_longest
    【解决方案2】:

    您可以使用字典理解:

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

    【讨论】:

    • 如果xy 长,会发生什么?没错,IndexError.
    • 如果您希望 x 和 y 的长度相同,则 zip 方法也不会给您想要的东西(它会默默地产生意想不到的结果,而不是错误)。这种方法在 imo 中要简单得多,您可能需要明确地处理不同长度的键/值列表。
    • (不过,一旦你知道“zip 意味着制作字典”这个成语,我想它同样具有可读性。)
    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2022-06-13
    • 2020-02-17
    • 2020-05-25
    相关资源
    最近更新 更多