将[key1,val1,key2,val2]转换为字典?

231 投票
12 回答
584050 浏览
提问于 2025-04-16 09:17

假设我在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))

否则你需要用分号把它写成一行。

撰写回答