假设我在Python中有一个列表a,它的条目很方便地映射到一个字典。每个偶数元素表示字典的键,接下来的奇数元素是值

例如,

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

我想把它转换成一个字典b,其中

b['hello'] = 'world'
b['1'] = '2'

在语法上最干净的方法是什么?


当前回答

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及以后版本中,您可以使用"walrus"操作符(:=)将其写在一行中:

b = dict(zip(i := iter(a), i))

否则,您需要使用分号将其放在一行上。

其他回答

试试下面的代码:

  >>> d2 = dict([('one',1), ('two', 2), ('three', 3)])
  >>> d2
      {'three': 3, 'two': 2, 'one': 1}

我还非常希望有一个用于此转换的一行程序,因为这样的列表是Perl中哈希的默认初始化式。

在这篇文章中给出了非常全面的答案

Python转换列表到字典

我的一个我是Python新手),使用Python 2.7生成器表达式,将是:

dict([我],[i + 1])我的范围(0,len (a) - 1, 2))

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及以后版本中,您可以使用"walrus"操作符(:=)将其写在一行中:

b = dict(zip(i := iter(a), i))

否则,您需要使用分号将其放在一行上。

简单的答案

另一个选择(由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}

您也可以尝试这种方法将键和值保存在不同的列表中,然后使用dict方法

data=['test1', '1', 'test2', '2', 'test3', '3', 'test4', '4']

keys=[]
values=[]
for i,j in enumerate(data):
    if i%2==0:
        keys.append(j)
    else:
        values.append(j)

print(dict(zip(keys,values)))

输出:

{'test3': '3', 'test1': '1', 'test2': '2', 'test4': '4'}