2017-03-02 118 views
6

给出一个列表:转换列表字典蟒蛇

source = [{'A':123},{'B':234},{'C':345}] 

我需要从该列表的字典格式:

newDict = {'A':123,'B':234,'C':345} 

什么是完成这一任务的语法干净的方式?

+0

可能的重复[将列表转换为Python中的字典](http://stackoverflow.com/questions/4576115/convert-a-list-to-a-dictionary-in-python) –

+1

当然不是最“语法上干净”的方式,但有点乐趣:'reduce(lambda d,cur:d.update(cur)or d,source,{})' – miradulo

+0

如果你有一个列表'[{'A':123}, {'A':456}]'?如果结果是'{'A':123}'或'{'A':456}'? –

回答

6

使用的字典 - 理解:

>>> l = [{'A':123},{'B':234},{'C':345}] 
>>> d = {k: v for dct in l for k, v in dct.items()} 
>>> d 
{'A': 123, 'B': 234, 'C': 345} 

但是它可能意见为基础,如果是这样的“语法干净的方式”,但我喜欢它。

0

如果你经常使用它,你可能希望定义一个merge功能,然后你就可以传递给reduce

from functools import reduce # Needed for Python3 
source = [{'A':123},{'B':234},{'C':345}] 

def merge(a,b): 
    d = a.copy() 
    d.update(b) 
    return d 

print(reduce(merge, source)) 
#=> {'A': 123, 'C': 345, 'B': 234} 
1

这里有一个额外的方法,在这里提供给你的Python如何实现一个味道该功能编程技术通过reduce()功能被称为reduction。在Python 3中,reduce() is in the functools package。在Python 2中,reduce() is a built-in function。我使用Python 3在下面的例子:

from functools import reduce # don't import if you are using Python 2 

def updater(dict_orig, dict_add): 
    dict_orig.update(dict_add) 
    return dict_orig 

new_dict = reduce(updater, l, dict()) 

的第一个参数reduce()是在迭代操作的功能,第二个是可迭代本身(列表l),第三个是可选的初始化对象放在list的开头减少。

减少的每一步都需要一个对象进行操作:即上一步的结果。但dict.update()不会返回任何内容,因此我们需要上面的updater()函数,它执行更新,然后返回正在更新的dict,从而为下一步提供所需的对象。如果dict.update()没有返回值,那么这将全部是单线。

因为dict.update()直接作用于原dict,我们需要一个可选的空dict()初始化对象开出减少 - 在原始l名单没有它,首先dict将被修改。

由于所有这些原因,我喜欢@ MSeifert的dict-comprehension方法好得多,但无论如何我只是为了说明Python的缩减而发布了这个方法。