2013-09-16 40 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']