只是想知道一個好辦法如何做到這一點:Python化和緊湊的方式比較關鍵的字典
a = {'key':'value'}
if 'key' in a:
if a['key'] == 'value':
# do something ...
的問題是,有時我需要處理的情況下,磨片"key"
實際上是"@key"
,所以我不't想複製相同的代碼if '@key' in a: ....
所以問題是如何處理大多數Pythonic和更緊湊的兩種情況?
只是想知道一個好辦法如何做到這一點:Python化和緊湊的方式比較關鍵的字典
a = {'key':'value'}
if 'key' in a:
if a['key'] == 'value':
# do something ...
的問題是,有時我需要處理的情況下,磨片"key"
實際上是"@key"
,所以我不't想複製相同的代碼if '@key' in a: ....
所以問題是如何處理大多數Pythonic和更緊湊的兩種情況?
你在找什麼是一個功能,如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
非常感謝你的詳細解釋!幫了很多 – Vor
這個怎麼樣:
if a.get('key', a.get('@key', None)) == 'value':
這結合了鍵(和擺脫稍不Python的使用if... in...
隨後的a['key']
)。
非常感謝你 – Vor
另一個想法是創建一個函數,將作爲代碼保持器(好,這或多或少是什麼功能):
a = {'key':'value'}
def handle(key):
if key in a:
if a[key] == 'value':
# do something...
handle('key')
handle('@key')
這將是一個很好的解決方案,如果你確實有與key
做些事情(例如更新現有條目)。
這是一個好點 – Vor
如果您已經不僅僅是「鍵」和「@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']
在將數據插入字典之前,難道你不能只取消所有前導'@'嗎? – zero323