沧海一幻觉
想象一下你有: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.6izip从…itertools成zip在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