2012-05-29 11 views
21

Próbuję zaimplementować, aby wyszukać wartość w słowniku Python dla określonych wartości klucza (używając wyrażenia regularnego jako klucza).Wartości wyszukiwania słownika języka Python dla kluczy używających wyrażeń regularnych

Przykład:

Mam słownika Pythona, który ma wartości takie jak:

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

muszę szukać wartości, których klucz ma „seller_account”? Napisałem przykładowy program, ale chciałbym wiedzieć, czy coś można zrobić lepiej. Głównym powodem jest to, że nie jestem pewien wyrażenia regularnego i przegapić czegoś (jak w jaki sposób ustawić ponownie za kluczowy rozpoczynający się od „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

Jeśli musisz często wyszukiwać takie części kluczy, prawdopodobnie coś jest nie tak z twoją strukturą danych. – eumiro

Odpowiedz

29

Jeśli tylko trzeba sprawdzić klucze, które zaczynają z "seller_account", nie trzeba regex, wystarczy użyć 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 

lub w sposób one_liner:

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

Aby "wynik" było ponownie słownik, możesz użyć 'dict()' lub (w Pythonie 2.7) '{...}' zamiast zrozumienia listy '[...]'. –

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

Możesz sprawić, by wyszukiwanie było bardziej ogólne poprzez uczynienie go niewrażliwym na wielkość liter, na przykład przez rzutowanie wyszukiwanego hasła i klawiszy na małe litery: 'if substr.lower() in key.lower()' – psychemedia

6

Możesz to rozwiązać przy pomocy dpath.

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

dpath pozwala wyszukiwać słowniki ze składnią glob na klawiszach i filtrować wartości. To, czego chcesz, jest banalne:

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

... To spowoduje powrót do dużego połączonego słownika wszystkich kluczy pasujących do tego globu. Jeśli chcesz tylko ścieżek i wartości:

$ 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, byłbym ostrożny z publikowaniem bez ujawnienia. ** Wszystkie twoje odpowiedzi ** dotyczą około * dpath *. Oczywiście wydajesz się lubić (lub część) dpath; jeśli tak, chciałbym przypomnieć, że ujawnienie powiązania jest obowiązkowe. – Jesse

+6

Sądząc z adresu URL github, wydaje się, że Andrew jest głównym autorem programu dpath. Nie widzę w tym nic złego, biorąc pod uwagę, że jest to licencjonowane oprogramowanie MIT. – dalloliogm

Powiązane problemy