新しい値で更新したいディクショナリ値がある場合に、新しい値が現在の値に関連するいくつかの基準(大きいなど)を満たしている場合に限り、多くの状況に遭遇します。
現在、私は次のような式を書いています。
dictionary[key] = max(newvalue, dictionary[key])
これは問題なく動作しますが、自分自身を繰り返すことを伴わない、おそらくそれを行うためのより良い方法があると私は考え続けています。
提案をありがとう。
新しい値で更新したいディクショナリ値がある場合に、新しい値が現在の値に関連するいくつかの基準(大きいなど)を満たしている場合に限り、多くの状況に遭遇します。
現在、私は次のような式を書いています。
dictionary[key] = max(newvalue, dictionary[key])
これは問題なく動作しますが、自分自身を繰り返すことを伴わない、おそらくそれを行うためのより良い方法があると私は考え続けています。
提案をありがとう。
そのロジックをカプセル化するupdateメソッドを使用してvaluesオブジェクトを作成できます。または、辞書をサブクラス化し、の動作を変更します__setitem__
。このように行うと、コードに精通していない人には何が起こっているのかがわかりにくくなることを覚えておいてください。あなたが今していることは、最も明確で明確です。
ヘルパー関数を自分で作成するだけです。
def update(dictionary, key, newvalue, func=max):
dictionary[key] = func(dictionary[key], newvalue)
それが「きちんとした」かどうかはわかりませんが、繰り返しを避ける1つの方法は、オブジェクト指向のアプローチを使用し、組み込みdict
クラスをサブクラス化して、何かがやりたいことを実行できるようにすることです。dict
これには、コードの残りの部分を変更せずに、インスタンスの代わりにカスタムクラスのインスタンスを使用できるという利点もあります。
class CmpValDict(dict):
""" dict subclass that stores values associated with each key based
on the return value of a function which allow the value passed to be
first compared to any already there (if there is no pre-existing
value, the second argument passed to the function will be None)
"""
def __init__(self, cmp=None, *args, **kwargs):
self.cmp = cmp if cmp else lambda nv,cv: nv # default returns new value
super(CmpValDict, self).__init__(*args, **kwargs)
def __setitem__(self, key, value):
super(CmpValDict, self).__setitem__(key, self.cmp(value, self.get(key)))
cvdict = CmpValDict(cmp=max)
cvdict['a'] = 43
cvdict['a'] = 17
print cvdict['a'] # 43
cvdict[43] = 'George Bush'
cvdict[43] = 'Al Gore'
print cvdict[43] # George Bush
三項演算子のPythonバージョンを使用するのはどうですか?
d[key]=newval if newval>d[key] else d[key]
または次の場合は1行:
if newval>d[key]: d[key]=newval