2017-01-04 4 views
-1

更新辞書のリストを与えられた辞書内の他のキーの値に基づいた条件に基づいて、Pythonで辞書のリスト内の値

the_list = [{k1:v1,k2:v2}, {k1:v3, k3:v4}, {k1:v5,k2:v6},{k3:v7}] 

どのように私はベースk2の値を更新することができます​​の値に基づく条件?

私はこの解決策を考え出しましたが、Pythonicを感じません。誰にでも良いソリューションですか?

for item in the_list: 
    if set([k1,k2]) <= item.keys(): 
    #cond evaluates to True or False 
    if cond(item[k1]): 
     item.update({k2:newvalue}) 

これは、マップやラムダ式でうまくいくでしょうか?

+2

を助け<= in'は、有効なPythonの演算子ではありません。最後の行をインデントしてはいけませんか? –

+2

また、変数名 'dict'の使用を避けたいのは、ビルトインをシャドウするためです。 1つのキーに 'dict.update()'を使う必要はありません。代わりに 'dict [k2] = newvalue'を使用してください。 –

+1

最後に、あなたのコードが辞書をインプレースで更新します。新しいリストを作成する必要はなく、元のリストが引き続き参照しているすべての辞書に変更を加えています。それが問題であれば、まずその辞書のコピーを作成する必要があります。 –

答えて

1

これは私が同じ操作を実行するために思い付いた最も簡単なコードです:​​および/またはnewvalueの値が生成され評価され、コードは「より一層かもしれない方法condによって

my_list = [{k1:v1,k2:v2}, {k1:v3, k3:v4}, {k1:v5,k2:v6},{k3:v7}] 
for my_dict in my_list: 
    if all (k in my_dict for k in ("k1", "k2")): 
     if cond(my_dict[k1]): 
      my_dict[k2] = newvalue # possibly pre-determined 

Python化された "。

+0

ありがとう。私は間違ってリスト要素を参照で更新しようとしていて、辞書を更新メソッドで更新しようとしていたと思っていました。それでもhttp://stackoverflow.com/questions/12229064/mapping-over-values-in-a-python-dictionaryで提案されている行に沿ってマップを作成できないのだろうかと思います。 –

+0

@ThijsCobben私が言ったように、 'map'と' lambda'の使い方は 'cond'と' newvalue'に依存します。 –

0

よくあるpython dir(dict)は辞書の利用可能な方法を示しています。また、dir(dict)の "somemethod"はsomedethodがsedデータ型で利用可能かどうかを示しています。 、>

['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__',\ 
'__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__',\ 
'__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__',\ 
'__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__',\ 
'__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems',\ 
'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values',\ 
'viewitems', 'viewkeys', 'viewvalues'] 

今、私たちはここにいくつかの物事を見ることができます -

py.2.7->

['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__',\ 
'__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__',\ 
'__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__',\ 
'__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__',\ 
'__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems',\ 
'iterkeys', 'itervalues','keys', 'pop', 'popitem', 'setdefault', 'update', 'values', \ 
'viewitems', 'viewkeys', 'viewvalues'] 

py.3.5:私たちは私たちの問題で、それを考慮場合SO我々は中にいることそれ自体ができpop、、has_key、 'get'、そしてPythonの辞書は並べ替えられていないので(それがそのまま出力されます)、updateも使用できます。

まず、辞書のトラフリストと条件トラフ項目を横断する必要があります。辞書マップや辞書の理解度に応じてトリックを行うことも、dict.items()だけでタプルのリストを返すこともできます。 そう

def duDict(dictionary,codnitionElement,keyInQuesiton): 
    el = dictionary.pop(keyInQuesiton) #similar as list.pop 
    if condition(dictionary.get(codnitionElement)): 
     el = something 
     dictionary.update({keyInQuesiton:el }) 
    else:pass 
    return dictionary 

その後、線に沿って何か

condDict = lambda dict: duDict(dict,predefinedCondition,forKey) 
map(condDict , listOfDicts) 

希望これは `

関連する問題