Pythonic和compact方式比较dict中的键

时间:2013-09-16 14:03:21

标签: python dictionary

只想知道如何做到这一点的好方法:

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

问题有时我需要处理"key"实际为"@key"的案例,所以我不想用if '@key' in a: ....

复制相同的代码

所以问题是如何以大多数Pythonic和更紧凑的方式处理这两种情况?

5 个答案:

答案 0 :(得分:8)

以下是我将如何做到这一点:

a = {'key':'value'}
if any(a.get(key, None) == 'value' for key in ('key','@key')):
    # do something ...

答案 1 :(得分:3)

这个怎么样:

if a.get('key', a.get('@key', None)) == 'value':

这结合了两个键(并且摆脱了if... in...后面a['key']的稍微非Pythonic使用。)

答案 2 :(得分:2)

另一个想法是创建一个函数,它将充当代码的持有者(好吧,或多或少是函数的用途):

a = {'key':'value'}

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

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

如果您真的需要对key执行某些操作(例如更新现有条目),这将是一个很好的解决方案。

答案 3 :(得分: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

答案 4 :(得分: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']