【发布时间】:2014-10-20 12:33:51
【问题描述】:
我有一个偶数长度的元组,其中包含 ('a','b','c','d','e','f') 之类的元素,我想将其转换为具有 ['a':'b', 'c':'d', 'e':'f'] 之类元素的字典。
我尝试使用dict(tuple),但这并没有帮助。我刚刚开始学习 Python,任何帮助都将非常感激。
【问题讨论】:
标签: python dictionary tuples
我有一个偶数长度的元组,其中包含 ('a','b','c','d','e','f') 之类的元素,我想将其转换为具有 ['a':'b', 'c':'d', 'e':'f'] 之类元素的字典。
我尝试使用dict(tuple),但这并没有帮助。我刚刚开始学习 Python,任何帮助都将非常感激。
【问题讨论】:
标签: python dictionary tuples
看起来您正在尝试将元组分组为对,然后从这些对中制作一个 dict。有两种方法可以做到这一点。
首先是压缩切片:
zip(t[::2], t[1::2])
这称为“扩展切片”,其格式为start:stop:step。第一个是::2,所以它有默认的开始(元组的开始)和停止(元组的结束),步长为2,所以它得到元素0、2和4。第二个一个是1::2,所以是一样的,只不过是从1开始,而不是默认的,所以得到元素1、3、5。
有关详细信息,请参阅Lists 上的教程部分。 (当然,您使用的是元组,而不是列表,但它们的切片方式相同。)
第二个是用自身压缩一个迭代器:
i = iter(t)
zip(i, i)
由于对i 的两个引用都是同一个迭代器,所以无论何时推进一个,它都会推进两个。所以,第一个得到#0,然后第二个得到#1,然后第一个得到#2,第二个得到#3,依此类推。
有关详细信息,请参阅 Iterators 上的教程部分。另请参阅How grouper works,它解释了这个想法的更一般版本(或至少尝试这样做)。
无论哪种方式,你都会得到('a', 'b'),然后是('c', 'd'),然后是('e', 'f'),所以你可以将它传递给dict:
dict(zip(t[::2], t[1::2]))
那么,哪个更好?
切片可能更容易理解。它通常也更快。
但是,切片不适用于任意可迭代对象,仅适用于序列,它会在大输入上浪费内存(您实际上是在制作序列的完整额外副本),而且泛化有点困难。
您应该了解它们的工作原理,以便做出适当的选择。
【讨论】:
def tup2dict():
tup = ('a','b','c','d','e','f')
print ({i:j for (i,j) in zip(tup,tup[1:])[::2]})
感谢iterating-over-every-two-elements-in-a-list 和python-dictionary-comprehensionn。
【讨论】:
dict 即可。
>>> tup = ('a','b','c','d','e','f')
>>> dct = dict(zip(tup[::2], tup[1::2]))
{'a': 'b', 'c': 'd', 'e', 'f'}
这应该可以解决问题
【讨论】:
试试这个:
t = ('a','b','c','d','e','f')
dict(t[i:i+2] for i in xrange(0, len(t), 2))
=> {'a': 'b', 'c': 'd', 'e': 'f'}
【讨论】:
你可以使用dict理解:
t = ('a','b','c','d','e','f')
d = {t[i]:t[i+1] for i in range(0,len(t),2)}
注意部分
range(0,len(t),2)
将生成表单列表
[0, 2, 4]
【讨论】: