在Python中将列表转换为字典

时间:2011-01-01 22:29:00

标签: python list dictionary

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

例如,

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

我想将其转换为字典b,其中

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

完成此任务的语法最干净的方法是什么?

13 个答案:

答案 0 :(得分:240)

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中最Pythonic的方法,尽管EOL在评论中指出,zip()在Python 3中已经很懒,所以你不需要{{1} }。

izip()

如果你想在一行上,你必须作弊并使用分号。 ; - )

答案 1 :(得分:45)

简单回答

另一种选择(由Alex Martelli提供https://stackoverflow.com/a/2597178/104264):

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}

答案 2 :(得分:15)

你可以很容易地使用dict理解:

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]

答案 3 :(得分:10)

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

ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}

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

答案 4 :(得分:4)

可能不是最pythonic,但

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

答案 5 :(得分:4)

你可以在不创建额外数组的情况下快速完成任务,因此即使对于非常大的数组也是如此:

dict(izip(*([iter(a)]*2)))

如果你有一个发电机a,那就更好了:

dict(izip(*([a]*2)))

这是破旧的:

iter(h)    #create an iterator from the array, no copies here
[]*2       #creates an array with two copies of the same iterator, the trick
izip(*())  #consumes the two iterators creating a tuple
dict()     #puts the tuples into key,value of the dictionary

答案 6 :(得分:1)

您也可以这样做(字符串在此处列出转换,然后转换为字典)

    string_list = """
    Hello World
    Goodbye Night
    Great Day
    Final Sunset
    """.split()

    string_list = dict(zip(string_list[::2],string_list[1::2]))

    print string_list

答案 7 :(得分:1)

我也非常有兴趣为这个转换设置一个单行程序,因为这样的列表是Perl中哈希的默认初始化程序。

此线程中给出了非常全面的答案 -

使用Python 2.7 Generator Expressions,使用{{3}},我是Python的新手,将是:

dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))

答案 8 :(得分:0)

我不确定这是否是pythonic,但似乎有效

def alternate_list(a):
   return a[::2], a[1::2]

key_list,value_list = alternate_list(a)
b = dict(zip(key_list,value_list))

答案 9 :(得分:0)

尝试以下代码:

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

答案 10 :(得分:0)

您也可以尝试这种方法保存不同列表中的键和值,然后使用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'}

答案 11 :(得分:0)

{x: a[a.index(x)+1] for x in a if a.index(x) % 2 ==0}

result : {'hello': 'world', '1': '2'}

答案 12 :(得分:-1)

#work~
`
a = ['Openstack','Puppet','Python']
b = {}
c = 0
for v in a:
    b[v] = c
    c+=1
print b

`