将[key1,val1,key2,val2]转换为字典?
假设我在Python中有一个列表a
,这个列表的内容可以方便地映射到一个字典里。每个偶数位置的元素代表字典的键,而紧接着的奇数位置的元素就是对应的值。
比如,
a = ['hello','world','1','2']
我想把它转换成一个字典b
,其中
b['hello'] = 'world'
b['1'] = '2'
那么,有什么语法上最简洁的方法来实现这个呢?
12 个回答
19
你可以很简单地用字典推导式来实现这个:
a = ['hello','world','1','2']
my_dict = {item : a[index+1] for index, item in enumerate(a) if index % 2 == 0}
这和下面的for循环是一样的:
my_dict = {}
for index, item in enumerate(a):
if index % 2 == 0:
my_dict[item] = a[index+1]
69
简单回答
还有一个选择(感谢 Alex Martelli - 来源):
dict(x[i:i+2] for i in range(0, len(x), 2))
相关说明
如果你有这个:
a = ['bi','double','duo','two']
而你想要这个(列表中的每个元素都对应一个特定的值(在这个例子中是2)):
{'bi':2,'double':2,'duo':2,'two':2}
你可以使用:
>>> dict((k,2) for k in a)
{'double': 2, 'bi': 2, 'two': 2, 'duo': 2}
307
b = dict(zip(a[::2], a[1::2]))
如果a
很大,你可能想要做一些类似下面的事情,这样就不会像上面那样产生临时列表。
from itertools import izip
i = iter(a)
b = dict(izip(i, i))
在Python 3中,你也可以使用字典推导式,但讽刺的是,我觉得最简单的方法还是用range()
和len()
,虽然这通常被认为是代码的坏习惯。
b = {a[i]: a[i+1] for i in range(0, len(a), 2)}
所以iter()/izip()
的方法在Python 3中可能仍然是最符合Python风格的,尽管正如EOL在评论中提到的,zip()
在Python 3中已经是懒加载的,所以你不需要izip()
。
i = iter(a)
b = dict(zip(i, i))
在Python 3.8及以后的版本中,你可以用“海象”运算符(:=
)把这段代码写成一行:
b = dict(zip(i := iter(a), i))
否则你需要用分号把它写成一行。