2013-09-16 2 views
3

Просто хочу знать, хороший способ, как это сделать:Pythonic и компактный способ сравнить ключ в Словаре

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

Проблема иногда мне нужно обрабатывать случаи Whe "key" на самом деле "@key", Так что я дон Не хотите дублировать тот же код с if '@key' in a: ....

Итак, вопрос в том, как обрабатывать оба случая в большинстве Pythonic и более компактно?

+5

Не можете ли вы удалить все ведущие '@' перед вставкой данных в словарь? – zero323

ответ

1

Что вы ищете, это функция, например, a.get('key'), которая проверяет несколько ключей. Поэтому я бы написал эту общую функцию. Это, по-моему, самый пифонический путь и приводит к самому компактному и удобочитаемому коду, когда вы его используете.

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': 

Это сочетает в себе оба ключа (и избавляется от слабонелинейных вещий использования 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'] 
Смежные вопросы