当前位置:  开发笔记 > 编程语言 > 正文

在Python中将两个列表转换为字典

如何解决《在Python中将两个列表转换为字典》经验,为你挑选了9个好方法。

想象一下,你有:

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

生成以下字典的最简单方法是什么?

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

Dan Lenski.. 1943

像这样:

>>> keys = ['a', 'b', 'c']
>>> values = [1, 2, 3]
>>> dictionary = dict(zip(keys, values))
>>> print(dictionary)
{'a': 1, 'b': 2, 'c': 3}

Voila :-)成对dict构造函数和zip函数非常有用:https://docs.python.org/3/library/functions.html#func-dict



1> Dan Lenski..:

像这样:

>>> keys = ['a', 'b', 'c']
>>> values = [1, 2, 3]
>>> dictionary = dict(zip(keys, values))
>>> print(dictionary)
{'a': 1, 'b': 2, 'c': 3}

Voila :-)成对dict构造函数和zip函数非常有用:https://docs.python.org/3/library/functions.html#func-dict


不知道为什么您会期望它,@ FernandoWittmann。{thing}是语法糖,用于构造包含一个元素的set()。“ {* iterable}”是语法糖,用于构造包含多个元素的“集合”。`{k:v}`或`{** mapping}`_will_构造一个`dict`,但是在语法上是完全不同的。
感谢Dan的评论。你是对的。我之所以发生混乱,是因为我通常使用sintax“ {}”作为字典。实际上,如果我们尝试使用type({}),则输出为dict。但是确实,如果我们尝试使用“ type({thing})”,那么输出就是“ set”。

2> 小智..:

试试这个:

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


对于Python2来说是真的,但在Python 3中,`zip`在内存消耗方面已经很经济了.https://docs.python.org/3/library/functions.html#zip事实上,您可以看到`6`在Python 3中使用`zip`来替换Python 2中的`itertools.izip` https:// pythonhosted.org/six/.

3> Aaron Hall..:

想象一下,你有:

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

生成以下字典的最简单方法是什么?

dict = {'name' : 'Monty', 'age' : 42, 'food' : 'spam'}
性能最佳 - Python 2.7和3,dict理解:

使用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

izipitertools变为zip在Python 3. izip大于拉链用于Python 2(因为它避免了不必要的列表创建)2.6或以下更好,理想的:

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

Python 3

在Python 3中,zip变为与itertools模块中相同的功能,因此它只是:

new_dict = dict(zip(keys, values))

然而,字典理解会更高效(请参阅本答案末尾的表现评论).

所有案件的结果:

在所有情况下:

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

最佳方法是使用iterable,同时避免创建不必要的数据结构.在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)

由于我们希望避免创建不必要的数据结构,我们通常希望避免使用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位Python 3.4.3中,在Ubuntu 14.04上,从最快到最慢排序:

>>> min(timeit.repeat(lambda: dict(zip(keys, values))))
0.4772876740025822
>>> min(timeit.repeat(lambda: {k: v for k, v in zip(keys, values)}))
0.5217149950040039
>>> min(timeit.repeat(lambda: {keys[i]: values[i] for i in range(len(keys))}))
0.6797661719901953
>>> min(timeit.repeat(lambda: dict([(k, v) for k, v in zip(keys, values)])))
0.7864680950006004
>>> min(timeit.repeat(lambda: dict((k, v) for k, v in zip(keys, values))))
0.8561034000013024



4> iny..:
>>> keys = ('name', 'age', 'food')
>>> values = ('Monty', 42, 'spam')
>>> dict(zip(keys, values))
{'food': 'spam', 'age': 42, 'name': 'Monty'}



5> Brendan Berg..:

您还可以在Python≥2.7中使用字典理解:

>>> keys = ('name', 'age', 'food')
>>> values = ('Monty', 42, 'spam')
>>> {k: v for k, v in zip(keys, values)}
{'food': 'spam', 'age': 42, 'name': 'Monty'}



6> Polla A. Fat..:

更自然的方式是使用字典理解

keys = ('name', 'age', 'food')
values = ('Monty', 42, 'spam')    
dict = {keys[i]: values[i] for i in range(len(keys))}



7> jfs..:

如果需要在创建字典之前转换键或值,则可以使用生成器表达式.例:

>>> adict = dict((str(k), v) for k, v in zip(['a', 1, 'b'], [2, 'c', 3])) 

看看代码像Pythonista:惯用Python.



8> kiriloff..:

使用Python 3.x,用于字典理解

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

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

print(dic)

关于字典理解的更多信息,有一个例子:

>>> print {i : chr(65+i) for i in range(4)}
    {0 : 'A', 1 : 'B', 2 : 'C', 3 : 'D'}



9> 小智..:

对于那些需要简单代码且不熟悉的人zip:

List1 = ['This', 'is', 'a', 'list']
List2 = ['Put', 'this', 'into', 'dictionary']

这可以通过一行代码完成:

d = {List1[n]: List2[n] for n in range(len(List1))}


如果`List1`比`List2`长,则会大声失败
推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有