2012-11-22 28 views
2

如何动态地将元组转换为键值对?Python中元组的关键值对

比方说,我有:

tuple = ('name1','value1','name2','value2','name3','value3') 

我希望把它变成一本字典:

dictionary = { name1 : value1, name2 : value2, name3 : value3) 
+0

你想发生,如果有奇数个在你的元组的项目是什么?另外,你不想使用'tuple'作为变量名... –

回答

13

转换的元组键值对,让dict构造构建一个字典:

it = iter(tuple_) 
dictionary = dict(zip(it, it)) 

zip(it, it)习语产生来自otherwi的项目对se flat iterable,提供可以传递给dict构造函数的一系列对。这个概括可以在itertools文档中作为grouper recipe获得。

如果输入足够大,请将zip替换为itertools.izip以避免分配临时列表。与基于映射t[i][i + 1]的表达式不同,上述操作不仅适用于序列,还适用于任何迭代。

+0

+1。爱这个解决方案。出于某种原因,我总是认为'zip()'不会按交替顺序使用它的参数。 –

+2

@JoelCornett'zip'并不在乎,它只是消耗从左到右的迭代。 (从左到右的消费实际上[在文档中保证](http://docs.python.org/2/library/functions.html#zip)正是为了使这个习惯用法工作。) – user4815162342

+0

顺便说一句,分组习语可以是,并且经常被表示为单行:'dict(zip(* [iter(tuple)] * 2))''。单线形式很难理解,所以我没有在这里使用它。 – user4815162342

2

只是做一个简单的循环。

my_dic = {} 
tuple = ('name1','value1','name2','value2','name3','value3') 
if len(tuple) % 2 == 1: 
    my_dic[tuple[-1]] = None 
for i in range(0, len(tuple) - 1, 2): 
    my_dic[tuple[i]] = tuple[i + 1] 
print my_dic 
2
tuple = ('name1','value1','name2','value2','name3','value3') 
d = {} 
for i in range(0, len(tuple), 2): 
    d[tuple[i]] = tuple[i+1] 
print d 
2
dictionary = {tuple[i]: tuple[i + 1] for i in range(0, len(tuple), 2)} 

另一种简单的方法:

dictionary = dict(zip(tuple[::2],tuple[1::2])) 
+0

+1简化和使用dict解析 – user4815162342

相关问题