2012-05-29 4 views
21

Я пытаюсь реализовать для поиска значения в словаре Python для определенных значений ключа (используя регулярное выражение в качестве ключа).Значения словаря на Python для ключей с использованием регулярного выражения

Пример:

У меня есть словарь Python, который имеет такие значения, как:

{'account_0':123445,'seller_account':454545,'seller_account_0':454676, 'seller_account_number':3433343} 

Мне нужно найти значения которых ключ имеет 'seller_account'? Я написал образец программы, но хотел бы знать, можно ли что-то сделать лучше. Основная причина в том, что я не уверен в регулярном выражении и упустить что-то (например, как установить повторно для ключа, начиная с «seller_account»):

#!usr/bin/python 
import re 
my_dict={'account_0':123445,'seller_account':454545,'seller_account_0':454676, 'seller_account_number':3433343} 

reObj = re.compile('seller_account') 

for key in my_dict.keys(): 
     if(reObj.match(key)): 
       print key, my_dict[key] 

~ home> python regular.py 

seller_account_number 3433343 
seller_account_0 454676 
seller_account 454545 
+0

Если вам приходится часто искать такие части ключей, возможно, что-то не так с вашей структурой данных. – eumiro

ответ

29

Если вам нужно только проверить ключи, которые начинают с "seller_account", вам не нужно регулярное выражение, просто использовать startswith()

my_dict={'account_0':123445,'seller_account':454545,'seller_account_0':454676, 'seller_account_number':3433343} 

for key, value in my_dict.iteritems(): # iter on both keys and values 
     if key.startswith('seller_account'): 
       print key, value 

или в one_liner образом:

result = [(key, value) for key, value in my_dict.iteritems() if key.startswith("seller_account")] 
+1

Чтобы сделать 'result' словарь снова, вы можете использовать 'dict()' или (в Python 2.7) '{...}' вместо понимания списка '[...]'. –

8
def search(dictionary, substr): 
    result = [] 
    for key in dictionary: 
     if substr in key: 
      result.append((key, dictionary[key])) 
    return result 

>>> my_dict={'account_0':123445,'seller_account':454545,'seller_account_0':454676, 'seller_account_number':3433343} 
>>> search(my_dict, 'seller_account') 
[('seller_account_number', 3433343), ('seller_account_0', 454676), ('seller_account', 454545)] 
+1

Вы можете сделать поиск более универсальным, сделав его нечувствительным к регистру, например, произнеся поисковый запрос и клавиши в нижний регистр: 'if substr.lower() в key.lower()' – psychemedia

6

Вы можете решить это с помощью dpath.

http://github.com/akesterson/dpath-python

dpath позволяет осуществлять поиск словарей с синтаксисом Глоб по клавишам, и фильтровать значения. То, что вы хотите, тривиально:

$ easy_install dpath 
>>> dpath.util.search(MY_DICT, 'seller_account*') 

... Это вернет вам большой объединенный словарь всех ключей, соответствующих этому шару. Если вам нужны только пути и значения:

$ easy_install dpath 
>>> for (path, value) in dpath.util.search(MY_DICT, 'seller_account*', yielded=True): 
>>> ... # do something with the path and value 
+0

Andrew, я буду осторожен с публикацией без раскрытия. ** Все ваши ответы ** касаются * dpath *. Вы, очевидно, кажется любимым (или частью) dpath; если вы хотите, я хотел бы напомнить вам, что обязательно раскрывать вашу принадлежность. – Jesse

+6

Судя по URL-адресу github, кажется, что Андрей является главным автором dpath. Я не вижу в этом ничего плохого, учитывая, что это лицензионное программное обеспечение MIT. – dalloliogm

Смежные вопросы