Python中用于比较字典键的Pythonic和简洁方式

3

我想知道如何以一个好的方式进行以下操作:

a = {'key':'value'}
if 'key' in a:
    if a['key'] == 'value':
        # do something ...

问题在于有时我需要处理 "key" 实际上是 "@key" 的情况,所以我不想使用重复的代码来判断 @key 是否在 a 中,如下所示:if '@key' in a: .... 因此问题是如何以最Pythonic和更紧凑的方式处理这两种情况?

5
你不能在将数据插入字典之前仅仅剥离所有前导的 @ 吗? - zero323
5个回答

8
这是我处理此事的方法:
a = {'key':'value'}
if any(a.get(key, None) == 'value' for key in ('key','@key')):
    # do something ...

3
这个怎么样:
if a.get('key', a.get('@key', None)) == 'value':

这将结合两个键(并消除了稍微不太Pythonic的使用 if... in... 接着是 a['key'])。

2
另一个想法是创建一个函数,它将作为代码的容器(嗯,这更或多或少是函数的用途):
a = {'key':'value'}

def handle(key):
    if key in a:
        if a[key] == 'value':
            # do something...

handle('key')
handle('@key')

如果你需要对key进行操作(例如更新现有条目),那么这将是一个不错的解决方案。

1
你需要的是像 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

1
如果您有更多的潜在模式,而不仅仅是'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']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接