在Python中将列表转换为字典

Mik*_*ike 177 python dictionary list

假设我a在Python中有一个列表,其条目可以方便地映射到字典.每个偶数元素代表字典的键,以下奇数元素是值

例如,

a = ['hello','world','1','2']
Run Code Online (Sandbox Code Playgroud)

我想把它转换成字典b,在那里

b['hello'] = 'world'
b['1'] = '2'
Run Code Online (Sandbox Code Playgroud)

什么是语法上最干净的方法来实现这一目标?

kin*_*all 255

b = dict(zip(a[::2], a[1::2]))
Run Code Online (Sandbox Code Playgroud)

如果a很大,你可能想要做类似下面的事情,它不会像上面那样制作任何临时列表.

from itertools import izip
i = iter(a)
b = dict(izip(i, i))
Run Code Online (Sandbox Code Playgroud)

在Python 3中你也可以使用dict理解,但具有讽刺意味的是,我认为最简单的方法是使用range()len(),这通常是代码气味.

b = {a[i]: a[i+1] for i in range(0, len(a), 2)}
Run Code Online (Sandbox Code Playgroud)

因此,该iter()/izip()方法仍然可能是Python 3中最Pythonic 的方法,尽管EOL在评论中指出,zip()在Python 3中已经很懒,所以你不需要izip().

i = iter(a)
b = dict(zip(i, i))
Run Code Online (Sandbox Code Playgroud)

如果你想要它在一行,你将不得不作弊并使用分号.;-)

  • ...或者只是`zip(i,i)`,在Python 3中,因为`zip()`现在返回一个迭代器. (8认同)
  • 请注意,Python 2.7.3也具有dict理解能力 (5认同)

Job*_*Job 50

简单回答

另一种选择(由Alex Martelli提供/sf/answers/181802491/):

dict(x[i:i+2] for i in range(0, len(x), 2))
Run Code Online (Sandbox Code Playgroud)

相关说明

如果你有这个:

a = ['bi','double','duo','two']
Run Code Online (Sandbox Code Playgroud)

你想要这个(列表中每个元素键入一个给定的值(在这种情况下为2)):

{'bi':2,'double':2,'duo':2,'two':2}
Run Code Online (Sandbox Code Playgroud)

您可以使用:

>>> dict((k,2) for k in a)
{'double': 2, 'bi': 2, 'two': 2, 'duo': 2}
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于Python 3吗? (2认同)
  • 使用`fromkeys`。``>>> dict.fromkeys(a,2){'bi':2,'double':2,'duo':2,'two':2}``` (2认同)
  • 这是在做一些不同于问题所问的事情。 (2认同)

Chr*_*ena 16

您可以非常轻松地使用dict理解:

a = ['hello','world','1','2']

my_dict = {item : a[index+1] for index, item in enumerate(a) if index % 2 == 0}
Run Code Online (Sandbox Code Playgroud)

这相当于下面的for循环:

my_dict = {}
for index, item in enumerate(a):
    if index % 2 == 0:
        my_dict[item] = a[index+1]
Run Code Online (Sandbox Code Playgroud)


rix*_*rix 10

我发现很酷的东西,如果你的清单只有2个项目:

ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}
Run Code Online (Sandbox Code Playgroud)

请记住,dict接受包含iterable的任何iterable,其中iterable中的每个项本身必须是具有两个对象的iterable.

  • 漂亮又时尚。**'iterable 中的每一项本身都必须是一个恰好有两个对象的 iterable。'** 是这里的关键事实。 (2认同)

sah*_*hhm 5

可能不是最pythonic的,但是

>>> b = {}
>>> for i in range(0, len(a), 2):
        b[a[i]] = a[i+1]
Run Code Online (Sandbox Code Playgroud)

  • 阅读 [`enumerate`](http://docs.python.org/library/functions.html#enumerate) (10认同)
  • enumerate 不允许您指定步长,但您可以使用 `for i, key in enumerate(a[::2]):`。仍然是 unpythonic,因为 dict 构造函数可以为您完成大部分工作 (5认同)