2012-05-29 107 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 key.lower()中的substr.lower()' – psychemedia

6

你可以用dpath解决这个问题。

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

dpath让您搜索词典与密钥的水珠语法,并筛选值。你想要的是微不足道的:

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

...这将返回一个与该glob匹配的所有键的大合并字典。如果您只想要路径和值:

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

安德鲁,我会小心张贴不披露。 **你所有的答案都是* dpath *。你显然很喜欢(或部分)dpath;如果你是,我想提醒你必须公开你的联盟。 – Jesse

+6

从github网址判断,Andrew似乎是dpath的主要作者。鉴于它是麻省理工学院许可的软件,我没有看到任何问题。 – dalloliogm