只想知道如何做到这一点的好方法:
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':
这结合了两个键(并摆脱了稍微非 Pythonic 的if... in...
其次是a['key']
)。
另一个想法是创建一个函数作为代码的持有者(嗯,这或多或少是函数的用途):
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)这是一种方法:
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']