web-dev-qa-db-ja.com

リストの各辞書に要素を追加します(リスト内包表記)

辞書のリストがあり、このリストの各要素にキーを追加したい。私は試した:

result = [ item.update({"elem":"value"}) for item in mylist ]

しかし、更新メソッドはNoneを返すため、結果リストにはNoneがいっぱいです。

result = [ item["elem"]="value" for item in mylist ]

構文エラーを返します。

26
MickaëlG

更新された辞書への参照は古い辞書への参照と同じであるため、新しい辞書のリストを作成することを心配する必要はありません。

 for item in mylist:
    item.update( {"elem":"value"})
26

リストの内包表記を使用したい場合は、ここに素晴らしい答えがあります: https://stackoverflow.com/a/3197365/4403872

あなたの場合、次のようになります。

result = [dict(item, **{'elem':'value'}) for item in myList]

例:

myList = [{'a': 'A'}, {'b': 'B'}, {'c': 'C', 'cc': 'CC'}]

次に、いずれかを使用します

result = [dict(item, **{'elem':'value'}) for item in myList]

または

result = [dict(item, elem='value') for item in myList]

最後に、

>>> result
[{'a': 'A', 'elem': 'value'},
 {'b': 'B', 'elem': 'value'},
 {'c': 'C', 'cc': 'CC', 'elem': 'value'}]
32
vk1011

マップを使用できます。

result = map(lambda item: dict(item, elem='value'), myList)

すでに要素のリストがある場合は、次のことができます。

#elements = ['value'] * len(myList)
result = map(lambda item: dict(item[0], elem=item[1]),Zip(myList,elements))

その後、結果があります

6
Asive Dlaba

@ vk1011の答えは適切であり、スプレッド演算子で簡潔に拡張でき、新しい辞書オブジェクトは追加の利点です

  1. 既存のキーの値を新しいもので上書きするには、新しいアイテムの前にスプレッド演算子を配置できます

    result = [{**item, 'elem':'value'} for item in myList]
    
  2. 新しいエントリの値を既存の値で上書きするには、新しいアイテムの後にスプレッド演算子を使用します

    result = [{'elem':'value', **item} for item in myList]
    

両方のメソッドは、新しいアイテムを含む辞書オブジェクトのリストを提供します

3
>>> a = [ { 1:1 }, {2:2}, {3:3} ]
>>> for item in a:
...     item.update( { "test": "test" } )
... 
>>> a
[{'test': 'test', 1: 1}, {'test': 'test', 2: 2}, {'test': 'test', 3: 3}]

リストの内包表記を誤って使用しています。item.updateNone値を返すため、新しく作成されたリストは、予想されるNone値ではなく、dict値でいっぱいになります。

リストにはdict値への参照が保持されるため、リスト内のアイテムをループして、それぞれを適宜更新するだけで済みます。

2
sean

リスト内包表記を使用しないか、元のdictと新しいキーに基づいてnew dictを返します。

[dict(list(item.items()) + [("elem", "value")]) for item in mylist]
0
Martijn Pieters