猿问

用Python将两个列表转换为字典

用Python将两个列表转换为字典

想象一下你有:

keys = ['name', 'age', 'food']values = ['Monty', 42, 'spam']

制作以下词典的最简单方法是什么?

a_dict = {'name' : 'Monty', 'age' : 42, 'food' : 'spam'}


海绵宝宝撒
浏览 4552回答 4
4回答

繁花如伊

试试这个:>>> import itertools>>> keys = ('name', 'age', 'food')>>> values = ('Monty', 42, 'spam')>>> adict = dict(itertools.izip(keys,values))>>> adict{'food': 'spam', 'age': 42, 'name': 'Monty'}在Python 2中,与zip.

沧海一幻觉

想象一下你有:keys&nbsp;=&nbsp;('name',&nbsp;'age',&nbsp;'food')values&nbsp;=&nbsp;('Monty',&nbsp;42,&nbsp;'spam')制作以下词典的最简单方法是什么?dict&nbsp;=&nbsp;{'name'&nbsp;:&nbsp;'Monty',&nbsp;'age'&nbsp;:&nbsp;42,&nbsp;'food'&nbsp;:&nbsp;'spam'}最具表现力的-Python2.7和3,DECT理解:对使用dict构造函数的一个可能的改进是使用dict理解的本机语法(而不是列表理解,就像其他人错误地说的那样):new_dict&nbsp;=&nbsp;{k:&nbsp;v&nbsp;for&nbsp;k,&nbsp;v&nbsp;in&nbsp;zip(keys,&nbsp;values)}在Python 2中,zip返回列表,若要避免创建不必要的列表,请使用izip相反(别名为zip可以减少迁移到Python 3时的代码更改)。from&nbsp;itertools&nbsp;import&nbsp;izip&nbsp;as&nbsp;zip因此,这仍然是:new_dict&nbsp;=&nbsp;{k:&nbsp;v&nbsp;for&nbsp;k,&nbsp;v&nbsp;in&nbsp;zip(keys,&nbsp;values)}Python 2,适合<=2.6izip从…itertools成zip在Python 3中。izip它比Python 2的zip更好(因为它避免了不必要的列表创建),并且适合2.6或更低版本:from&nbsp;itertools&nbsp;import&nbsp;izip new_dict&nbsp;=&nbsp;dict(izip(keys,&nbsp;values))Python 3在Python 3中,zip中的相同函数。itertools模块,因此简单地说:new_dict&nbsp;=&nbsp;dict(zip(keys,&nbsp;values))但是,DECT的理解会更有表现力(参见这个答案末尾的性能评估)。所有案件的结果:在所有情况下:>>>&nbsp;new_dict{'age':&nbsp;42,&nbsp;'name':&nbsp;'Monty',&nbsp;'food':&nbsp;'spam'}说明:如果我们看看帮助dict我们看到,它采取了各种形式的论点:>>>&nbsp;help(dict)class&nbsp;dict(object) &nbsp;|&nbsp;&nbsp;dict()&nbsp;->&nbsp;new&nbsp;empty&nbsp;dictionary&nbsp;|&nbsp;&nbsp;dict(mapping)&nbsp;->&nbsp;new&nbsp;dictionary&nbsp;initialized&nbsp;from&nbsp;a&nbsp;mapping&nbsp;object's &nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(key,&nbsp;value)&nbsp;pairs &nbsp;|&nbsp;&nbsp;dict(iterable)&nbsp;->&nbsp;new&nbsp;dictionary&nbsp;initialized&nbsp;as&nbsp;if&nbsp;via: &nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;=&nbsp;{} &nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;k,&nbsp;v&nbsp;in&nbsp;iterable: &nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[k]&nbsp;=&nbsp;v &nbsp;|&nbsp;&nbsp;dict(**kwargs)&nbsp;->&nbsp;new&nbsp;dictionary&nbsp;initialized&nbsp;with&nbsp;the&nbsp;name=value&nbsp;pairs &nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;the&nbsp;keyword&nbsp;argument&nbsp;list.&nbsp;&nbsp;For&nbsp;example:&nbsp;&nbsp;dict(one=1,&nbsp;two=2)最佳方法是使用可迭代的方法,同时避免创建不必要的数据结构。在Python 2中,zip创建了一个不必要的列表:>>>&nbsp;zip(keys,&nbsp;values)[('name',&nbsp;'Monty'),&nbsp;('age',&nbsp;42),&nbsp;('food',&nbsp;'spam')]在Python 3中,相当于:>>>&nbsp;list(zip(keys,&nbsp;values))[('name',&nbsp;'Monty'),&nbsp;('age',&nbsp;42),&nbsp;('food',&nbsp;'spam')]和Python 3的zip只创建一个可迭代的对象:>>>&nbsp;zip(keys,&nbsp;values)<zip&nbsp;object&nbsp;at&nbsp;0x7f0e2ad029c8>由于我们希望避免创建不必要的数据结构,所以我们通常希望避免Python 2的数据结构。zip(因为它创建了一个不必要的列表)。绩效较差的替代办法:这是一个正在传递给dict构造函数的生成器表达式:generator_expression&nbsp;=&nbsp;((k,&nbsp;v)&nbsp;for&nbsp;k,&nbsp;v&nbsp;in&nbsp;zip(keys,&nbsp;values))dict(generator_expression)或相当于:dict((k,&nbsp;v)&nbsp;for&nbsp;k,&nbsp;v&nbsp;in&nbsp;zip(keys,&nbsp;values))这是传递给dict构造函数的列表理解:dict([(k,&nbsp;v)&nbsp;for&nbsp;k,&nbsp;v&nbsp;in&nbsp;zip(keys,&nbsp;values)])在前两种情况下,额外的一层非操作(因此是不必要的)计算被放置在zip迭代上,而在列表理解的情况下,额外的列表被不必要地创建。我希望他们都表现得不太好,当然也不会更多。业绩审查:在64位Python3.4.3中,在Ubuntu14.04上,命令从最快到最慢:>>> min(timeit.repeat(lambda: {k: v for k, v in zip(keys, values)}))0.7836067057214677>>> min(timeit.repeat(lambda: dict(zip(keys, values))))1.0321204089559615>>> min(timeit.repeat(lambda: {keys[i]: values[i] for i in range(len(keys))}))1.0714934510178864>>> min(timeit.repeat(lambda: dict([(k, v) for k, v in zip(keys, values)])))1.6110592018812895>>> min(timeit.repeat(lambda: dict((k, v) for k, v in zip(keys, values))))1.7361853648908436

不负相思意

>>> keys = ('name', 'age', 'food')>>> values = ('Monty', 42, 'spam')>>> dict(zip(keys, values)){'food': 'spam', 'age': 42, 'name': 'Monty'}
随时随地看视频慕课网APP

相关分类

Python
我要回答