Convert a list to a dictionary in Python
假设我有一个python中的
例如,
1 | a = ['hello','world','1','2'] |
我想把它转换成一本字典
1 2 | b['hello'] = 'world' b['1'] = '2' |
号
实现这一点的语法上最干净的方法是什么?
1 | b = dict(zip(a[::2], a[1::2])) |
如果
1 2 3 | from itertools import izip i = iter(a) b = dict(izip(i, i)) |
号
在python 3中,您也可以使用听写理解,但具有讽刺意味的是,我认为最简单的方法是使用
1 | b = {a[i]: a[i+1] for i in range(0, len(a), 2)} |
因此,
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))) |
号
如果你有一个发电机
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 |
号
`