将字符串列表转换为字典,奇数索引作为键,偶数索引作为值的Pythonic方法?

8 投票
5 回答
6385 浏览
提问于 2025-04-16 01:39

我有一个从某个地方解析出来的字符串列表,格式如下:

[key1, value1, key2, value2, key3, value3, ...]

我想根据这个列表创建一个字典,像这样:

{key1:value1, key2:value2, key3:value3, ...}

普通的 for 循环加上索引偏移可能可以解决这个问题,但我在想有没有更“Pythonic”的方法来做到这一点。列表推导式看起来很有趣,但我不知道怎么把它应用到这个具体的问题上。

有没有什么想法?

5 个回答

3
In [71]: alist=['key1', 'value1', 'key2', 'value2', 'key3', 'value3']

In [72]: dict(alist[i:i+2] for i in range(0,len(alist),2))
Out[72]: {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

5

这是一个展示我最喜欢的Python写法的好机会:

>>> S = [1,2,3,4,5,6]
>>> dict(zip(*[iter(S)]*2))
{1: 2, 3: 4, 5: 6}

那行看起来有点复杂的代码其实是把两个参数传给了zip(),而这两个参数都是同一个迭代器,指向S。zip()会创建包含两个元素的元组,每次都从这个迭代器中取出数据。然后,dict()会把这些元组转换成字典。

简单来说:

S = [1,2,3,4,5,6]

I = iter(S)
dict(zip(I,I))
16

你可以试试:

dict(zip(l[::2], l[1::2]))

解释一下:我们把一个列表分成两个列表,一个是偶数位置的元素,另一个是奇数位置的元素。我们通过从第一个元素或第二个元素开始,每隔一个元素取一个(这就是 l[::2]l[1::2] 的意思)。然后,我们用 zip 这个内置函数把这两个列表合并成一个包含成对元素的新列表。最后,我们用 dict 来根据这些键值对创建一个字典。

这个过程的时间复杂度和空间复杂度都是 ~4n,包括最后生成的字典。虽然如此,它可能比用循环来做要快,因为 zipdict 和切片操作都是用 C 语言写的。

撰写回答