为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

海绵宝宝撒 2019-05-31 17:05:03
用Python将两个列表转换为字典想象一下你有:keys = ['name', 'age', 'food']values = ['Monty', 42, 'spam']制作以下词典的最简单方法是什么?a_dict = {'name' : 'Monty', 'age' : 42, 'food' : 'spam'}
查看完整描述

4 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

试试这个:


>>> 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.


查看完整回答
反对 回复 2019-05-31
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

想象一下你有:

keys = ('name', 'age', 'food')values = ('Monty', 42, 'spam')

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

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

最具表现力的-Python2.7和3,DECT理解:

对使用dict构造函数的一个可能的改进是使用dict理解的本机语法(而不是列表理解,就像其他人错误地说的那样):

new_dict = {k: v for k, v in zip(keys, values)}

在Python 2中,zip返回列表,若要避免创建不必要的列表,请使用izip相反(别名为zip可以减少迁移到Python 3时的代码更改)。

from itertools import izip as zip

因此,这仍然是:

new_dict = {k: v for k, v in zip(keys, values)}

Python 2,适合<=2.6

izip从…itertoolszip在Python 3中。izip它比Python 2的zip更好(因为它避免了不必要的列表创建),并且适合2.6或更低版本:

from itertools import izip
new_dict = dict(izip(keys, values))

Python 3

在Python 3中,zip中的相同函数。itertools模块,因此简单地说:

new_dict = dict(zip(keys, values))

但是,DECT的理解会更有表现力(参见这个答案末尾的性能评估)。

所有案件的结果:

在所有情况下:

>>> new_dict{'age': 42, 'name': 'Monty', 'food': 'spam'}

说明:

如果我们看看帮助dict我们看到,它采取了各种形式的论点:

>>> help(dict)class dict(object)
 |  dict() -> new empty dictionary |  dict(mapping) -> new dictionary initialized from a mapping object's
 |      (key, value) pairs
 |  dict(iterable) -> new dictionary initialized as if via:
 |      d = {}
 |      for k, v in iterable:
 |          d[k] = v
 |  dict(**kwargs) -> new dictionary initialized with the name=value pairs
 |      in the keyword argument list.  For example:  dict(one=1, two=2)

最佳方法是使用可迭代的方法,同时避免创建不必要的数据结构。在Python 2中,zip创建了一个不必要的列表:

>>> zip(keys, values)[('name', 'Monty'), ('age', 42), ('food', 'spam')]

在Python 3中,相当于:

>>> list(zip(keys, values))[('name', 'Monty'), ('age', 42), ('food', 'spam')]

和Python 3的zip只创建一个可迭代的对象:

>>> zip(keys, values)<zip object at 0x7f0e2ad029c8>

由于我们希望避免创建不必要的数据结构,所以我们通常希望避免Python 2的数据结构。zip(因为它创建了一个不必要的列表)。

绩效较差的替代办法:

这是一个正在传递给dict构造函数的生成器表达式:

generator_expression = ((k, v) for k, v in zip(keys, values))dict(generator_expression)

或相当于:

dict((k, v) for k, v in zip(keys, values))

这是传递给dict构造函数的列表理解:

dict([(k, v) for k, v in zip(keys, 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


查看完整回答
反对 回复 2019-05-31
?
不负相思意

TA贡献1777条经验 获得超10个赞

>>> keys = ('name', 'age', 'food')

>>> values = ('Monty', 42, 'spam')

>>> dict(zip(keys, values))

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


查看完整回答
反对 回复 2019-05-31
  • 4 回答
  • 0 关注
  • 4433 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信