将列表转换为Python中的字典
比方说,我有一个Python列表,它的条目可以方便地映射到一个字典。 每个偶数元素代表字典的关键字,下面的奇数元素是值
例如,
a = ['hello','world','1','2']
我想把它转换成字典b
,在哪里
b['hello'] = 'world' b['1'] = '2'
语法上最干净的方法是什么?
b = dict(zip(a[0::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中已经是懒惰的,所以你不需要izip()
。
i = iter(a) b = dict(zip(i, i))
如果你想在一行上,你将不得不作弊,并使用分号。 😉
另一种选择(亚历克斯·马尔泰利提供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}
你可以很容易地使用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]
我发现很酷,这就是说,如果你的列表只有2个项目:
ls = ['a', 'b'] dict([ls]) >>> {'a':'b'}
请记住,dict接受任何包含iterable的迭代,其中iterable中的每个元素本身必须是一个具有两个对象的迭代。
可能不是最pythonic,但是
>>> b = {} >>> for i in range(0, len(a), 2): b[a[i]] = a[i+1]
你可以在不创建额外的数组的情况下快速完成,所以即使是非常大的数组也可以工作:
dict(izip(*([iter(a)]*2)))
如果你有一个发电机,甚至更好:
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
你也可以这样做(字符串在这里列出转换,然后转换成字典)
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
我也非常有兴趣为这个转换提供一个单线程,因为这样的列表是Perl中哈希的默认初始化程序。
在这个线程中给出了非常全面的答案 –
- Python将列表转换为字典
使用Python 2.7 Generator Expressions开发一个我是Python的新手)将是:
dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))
我不确定这是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))
#work~ ` a = ['Openstack','Puppet','Python'] b = {} c = 0 for v in a: b[v] = c c+=1 print b
`
在Python中它非常简单:
dict(a)