25

だから私の目的はから行くことです:

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

より良いPythonの方法はありますか?

4

9 に答える 9

39

なぜコピーするのですか?

ChainMapPython 3では、新しい:を使用できます。

ChainMapは、複数のdict(または他のマッピング)をグループ化して、単一の更新可能なビューを作成します。
基になるマッピングはリストに保存されます。そのリストは公開されており、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'])
于 2013-03-29T13:25:58.873 に答える
32
finalMap = {}
for d in fruitColourMapping:
    finalMap.update(d)
于 2013-03-26T21:26:06.993 に答える
31
{k: v for d in fruitColourMapping for k, v in d.items()}
于 2013-03-26T21:28:41.263 に答える
14

分解して再構築するのではなく、コピーして更新するだけです。

final_map = {}
for fruit_color_definition in fruit_color_mapping:
    final_map.update(fruit_color_definition)
于 2013-03-26T21:26:15.040 に答える
5
dict(d.items()[0] for d in fruitColourMapping)
于 2013-03-26T21:26:51.510 に答える
5

アプローチ

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}
于 2013-03-30T02:01:42.780 に答える
5

与えられた

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'}
于 2017-09-14T09:35:58.357 に答える
4

私は面白いワンライナーを思いついた。

>>> 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}
于 2020-07-30T03:01:06.483 に答える
2

また、試すことができます:

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

于 2017-10-20T22:31:25.447 に答える