これを行う良い方法を知りたいだけです:
a = {'key':'value'}
if 'key' in a:
if a['key'] == 'value':
# do something ...
"key"
問題は、実際にあるケースを処理する必要がある場合があるため"@key"
、同じコードを複製したくないことですif '@key' in a: ....
問題は、ほとんどのPythonicでよりコンパクトな方法で両方のケースを処理する方法ですか?
これを行う良い方法を知りたいだけです:
a = {'key':'value'}
if 'key' in a:
if a['key'] == 'value':
# do something ...
"key"
問題は、実際にあるケースを処理する必要がある場合があるため"@key"
、同じコードを複製したくないことですif '@key' in a: ....
問題は、ほとんどのPythonicでよりコンパクトな方法で両方のケースを処理する方法ですか?
これを行う方法は次のとおりです。
a = {'key':'value'}
if any(a.get(key, None) == 'value' for key in ('key','@key')):
# do something ...
これはどうですか:
if a.get('key', a.get('@key', None)) == 'value':
if... in...
これにより、両方のキーが結合されます (そして、後に続くの少し非 Pythonic な使用が取り除かれa['key']
ます)。
もう 1 つのアイデアは、コードのホルダーとして機能する関数を作成することです (多かれ少なかれ、それが関数の目的です)。
a = {'key':'value'}
def handle(key):
if key in a:
if a[key] == 'value':
# do something...
handle('key')
handle('@key')
これは、実際に何かを行う必要がある場合key
(たとえば、既存のエントリを更新するなど) に適したソリューションです。
あなたが探しているのは、a.get('key')
複数のキーをチェックするような関数です。したがって、その一般的な関数を記述します。私の意見では、これが最も Pythonic な方法であり、使用すると最もコンパクトで読みやすいコードになります。
1)ここに1つの方法があります:
def dget(d, keys, default=None):
for key in keys:
try: return d[key]
except KeyError: pass
return default
...
a = {'key':'value'}
if dget(a, ['key', '@key']) == 'value':
#do something
2) 正確に 'key' と '@key' を常に探したい場合は、あまり一般的ではない可能性があります。
def dget(d, key, default=None):
return d.get(key,d.get('@' + key, default))
...
a = {'key':'value'}
if dget(a, 'key') == 'value':
#do something
3) 最後に、dict クラスを拡張できます。get
メソッドを書き直して、
a = mydict()
a['key'] = 'value'
if a.get(['key', '@key']) == 'value':
#do something
'key' と '@key' 以外の潜在的なパターンがある場合は、各キーで正規表現を使用して値をテストできます。
import re
a = {'key':'value', '@key':'value', '#key':'value', 'k':'value', 'key2':'val'}
print [k for k,v in a.items() if re.search(r'.?key',k) and v=='value']
# ['@key', '#key', 'key']