2013-09-16 43 views
3

只是想知道一个好办法如何做到这一点:Python化和紧凑的方式比较关键的字典

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

的问题是,有时我需要处理的情况下,磨片"key"实际上是"@key",所以我不't想复制相同的代码if '@key' in a: ....

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

+5

在将数据插入字典之前,难道你不能只取消所有前导'@'吗? – zero323

回答

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”。

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 
+0

非常感谢你的详细解释!帮了很多 – Vor

8

这是我怎么会去这样做:

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

我觉得这一个更容易阅读... – ixe013

+0

像这样的解决方案,很聪明 – Vor

3

这个怎么样:

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

这结合了键(和摆脱稍不Python的使用if... in...随后的a['key'])。

+0

非常感谢你 – Vor

2

另一个想法是创建一个函数,将作为代码保持器(好,这或多或少是什么功能):

a = {'key':'value'} 

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

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

这将是一个很好的解决方案,如果你确实有与key做些事情(例如更新现有条目)。

+0

这是一个好点 – Vor

1

如果您已经不仅仅是“键”和“@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']