天道酬勤,学无止境

"Flattening" a list of dictionaries

问题

所以我的目标是从:

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方式?

回答1

为什么要复制?

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

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

只需要这个(更改名称以遵守 Python 命名约定):

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'])
回答2
finalMap = {}
for d in fruitColourMapping:
    finalMap.update(d)
回答3
{k: v for d in fruitColourMapping for k, v in d.items()}
回答4
final_map = {}
for fruit_color_definition in fruit_color_mapping:
    final_map.update(fruit_color_definition)
回答5
dict(d.items()[0] for d in fruitColourMapping)
回答6

方法

使用 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}
回答7

给定

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

代码

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

{**d1, **d2}
# {'apple': 'red', 'banana': 'yellow'}

在 Python 3.9 中,引入了合并运算符:

d1 | d2
# {'apple': 'red', 'banana': 'yellow'}
回答8
>>> 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}
回答9

你也可以试试:

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

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐