在Python中将列表转换为字典

Convert a list to a dictionary in Python

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

例如,

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

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

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

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


1
b = dict(zip(a[::2], a[1::2]))

如果a是大的,那么您可能需要做如下的事情,而这并没有像上面那样列出任何临时列表。

1
2
3
from itertools import izip
i = iter(a)
b = dict(izip(i, i))

在python 3中,您也可以使用听写理解,但具有讽刺意味的是,我认为最简单的方法是使用range()len(),这通常是一种代码味道。

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

因此,iter()/izip()方法可能仍然是python 3中最为常见的方法,尽管正如eol在评论中指出的那样,zip()在python3中已经很懒惰了,所以您不需要izip()

1
2
i = iter(a)
b = dict(zip(i, i))

如果你想把它放在一行上,你就必须作弊并用分号。-)


简单的答案

另一个选项(Alex Martelli提供https://stackoverflow.com/a/2597178/104264):

1
dict(x[i:i+2] for i in range(0, len(x), 2))

。相关说明

如果你有这个:

1
a = ['bi','double','duo','two']

您需要这样做(列表中的每个元素键入一个给定值(在本例中为2)):

1
{'bi':2,'double':2,'duo':2,'two':2}

您可以使用:

1
2
>>> dict((k,2) for k in a)
{'double': 2, 'bi': 2, 'two': 2, 'duo': 2}


您可以很容易地使用听写理解:

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

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

这相当于下面的for循环:

1
2
3
4
my_dict = {}
for index, item in enumerate(a):
    if index % 2 == 0:
        my_dict[item] = a[index+1]


我觉得很酷,如果你的列表只有两个项目:

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

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


您可以在不创建额外数组的情况下非常快速地执行此操作,因此即使对于非常大的数组,也可以执行此操作:

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

如果你有一个发电机a,甚至更好:

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

下面是详细的介绍:

1
2
3
4
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


可能不是最凶猛的Python,但是

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


对于这个转换,我也非常感兴趣有一个一行程序,因为这样的列表是Perl中散列的默认初始值设定项。

这条线索给出了非常全面的答案。-

  • python将列表转换为字典
  • 小精灵

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

    埃多克斯1〔6〕


    您也可以这样做(在这里进行字符串到列表的转换,然后转换为字典)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        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


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

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


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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)))

    输出:

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

    尝试以下代码:

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


    我不确定这是不是Python,但似乎管用

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

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


    1
    2
    3
    4
    5
    6
    7
    8
    9
    #work~
    `
    a = ['Openstack','Puppet','Python']
    b = {}
    c = 0
    for v in a:
        b[v] = c
        c+=1
    print b

    `