2016-05-18 3 views
4

のは、私は辞書のリストがあるとしましょう:戻り辞書

>>> d = [{'a': 2, 'b': 3, 'c': 4}, {'a': 5, 'b': 6, 'c': 7}] 

をそして私は、私は、各辞書に一つだけ値を変更するマップの操作を実行します。辞書は多くのアイテムを持っている場合、これは手に負えない取得することができます

>>> map(lambda x: {'a': x['a'], 'b': x['b'] + 1, 'c': x['c']}, d) 
[{'a': 2, 'c': 4, 'b': 4}, {'a': 5, 'c': 7, 'b': 7}] 

:それを行うための1つの可能な方法は、単純に変更したものと一緒に元の値を含む新しい辞書を作成することです。

別の方法は、所望の値を変更するコピー元の辞書機能を定義するかもしれない:

>>> def change_b(x): 
...  new_x = x.copy() 
...  new_x['b'] = x['b'] + 1 
...  return new_x 
... 
>>> map(change_b, d) 
[{'a': 2, 'c': 4, 'b': 4}, {'a': 5, 'c': 7, 'b': 7}] 

これは、しかし、別の関数を書く必要とラムダ式の優雅さを失います。

良い方法がありますか?

答えて

4

これは動作します(とpython2とのpython3 と互換性があります):言ったことで

>>> map(lambda x: dict(x, b=x['b']+1), d) 
[{'a': 2, 'c': 4, 'b': 4}, {'a': 5, 'c': 7, 'b': 7}] 

、私は少なからず、lambdaベースのソリューションは、よりエレガント少ないであることを考えます
lambda対応...この声明の合理的な背景は、提案した非lambda解決策をすぐに見ることができ、正確に何をしているかです。私は実際に理解するために解析するために思考のビットを取り、その後、より思考でしょう書いたlambdaベースのソリューション...

ものの、mapはあなたにpython3.xそのISNの反復可能なオブジェクトを提供します'リスト...

1

コールでforループを使用できます。ここでハックワンライナーです:

dcts = [{'a': 2, 'b': 3, 'c': 4}, {'a': 5, 'b': 6, 'c': 7}] 
dcts = [d.update({'b': d['b']+1}) or d for d in dcts] 

編集:オリジナルdictsを維持するために:

from copy import copy 
dcts = [d.update({'b': d['b']+1}) or d for d in map(copy, dcts)] 
+1

これは元の 'd'を変更します。 –

3

まず、関数を記述することは最初の場所で私にそれが無粋いないようです。それは言った、Pythonの3.5とPEP 448の勇敢な新しい世界へようこそ:あなたのmapがどのように動作しているかから

>>> d = [{'a': 2, 'b': 3, 'c': 4}, {'a': 5, 'b': 6, 'c': 7}] 
>>> d 
[{'b': 3, 'a': 2, 'c': 4}, {'b': 6, 'a': 5, 'c': 7}] 
>>> [{**x, 'b': x['b']+1} for x in d] 
[{'b': 4, 'a': 2, 'c': 4}, {'b': 7, 'a': 5, 'c': 7}] 

は、それはあなたが2を使用している明らかだが、それは修正するのは簡単です。 :-)