“扁平化”词典列表

时间:2013-03-26 21:24:08

标签: python dictionary

所以我的目标是来自:

fruitColourMapping = [{'apple': 'red'}, {'banana': 'yellow'}]

finalMap = {'apple': 'red', 'banana': 'yellow'}

我得到的方法是:

 from itertools import chain
 fruits = list(chain.from_iterable([d.keys() for d in fruitColourMapping]))
 colour = list(chain.from_iterable([d.values() for d in fruitColourMapping]))
 return dict(zip(fruits, colour))

还有更好的pythonic方式吗?

10 个答案:

答案 0 :(得分:27)

finalMap = {}
for d in fruitColourMapping:
    finalMap.update(d)

答案 1 :(得分:25)

{k: v for d in fruitColourMapping for k, v in d.items()}

答案 2 :(得分:25)

为什么要复制?

在Python 3中,您可以使用新的ChainMap

  

ChainMap将多个dicts(或其他映射)组合在一起以创建单个可更新视图。
  底层映射存储在列表中。该清单是公开的   可以使用 maps 属性访问或更新。没有   其他州。查找依次搜索底层映射   直到找到钥匙。相反,写入,更新和删除   仅对第一个映射进行操作。

您只需要这个(执行更改名称以遵守Python naming conventions):

from collections import ChainMap
fruit_colour_mapping = [{'apple': 'red'}, {'banana': 'yellow'}]
final_map = ChainMap(*fruit_colour_mapping)

然后您可以使用所有常规映射操作:

# print key value pairs:
for element in final_map.items():
    print(element)

# change a value:
final_map['banana'] = 'green'    # supermarkets these days....

# access by key:
print(final_map['banana'])

答案 3 :(得分:13)

而不是解构和重构,只需复制和更新:

final_map = {}
for fruit_color_definition in fruit_color_mapping:
    final_map.update(fruit_color_definition)

答案 4 :(得分:5)

dict(d.items()[0] for d in fruitColourMapping)

答案 5 :(得分:3)

方法

使用reduce将每个dict应用于空的初始值设定项。由于dict.update始终返回None,因此请使用d.update(src) or dreduce提供所需的返回值。

代码

final_dict = reduce(lambda d, src: d.update(src) or d, dicts, {})

测试

>>> dicts = [{'a': 1, 'b': 2}, {'b': 3, 'c': 4}, {'a': 6}]
>>> final_dict = reduce(lambda d, src: d.update(src) or d, dicts, {})
>>> final_dict
{'a': 6, 'c': 4, 'b': 3}

答案 6 :(得分:3)

在Python 3.5中,引入了字典解包(参见PEP 448):

a, b = [{'apple': 'red'}, {'banana': 'yellow'}]
{**a, **b}
# {'apple': 'red', 'banana': 'yellow'}

答案 7 :(得分:2)

我想出了一个有趣的衬垫。

>>> a = [{"wow": 1}, {"ok": 2}, {"yeah": 3}, {"ok": [1,2,3], "yeah": True}]
>>> a = dict(sum(map(list, map(dict.items, a)), []))
>>> a
{'wow': 1, 'ok': [1, 2, 3], 'yeah': True}

答案 8 :(得分:1)

您也可以尝试:

finalMap = dict(item for mapping in fruitColourMapping for item in mapping.items())

答案 9 :(得分:0)

为什么不解包,python 3.5 up:

a, b = [{'apple': 'red'}, {'banana': 'yellow'}]
print(dict(a,**b))

现在您已经拥有:

{'apple': 'red', 'banana': 'yellow'}

用于输出。