44

我正在尝试实现在 Python 字典中搜索特定键值的值(使用正则表达式作为键)。

例子:

我有一个 Python 字典,它的值如下:

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

我需要搜索键为“seller_account”的值?我写了一个示例程序,但想知道是否可以做得更好。主要原因是我不确定正则表达式并错过了一些东西(比如我如何为以'seller_account'开头的键设置re):

#!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
4

5 回答 5

53

如果您只需要检查以 开头的键,则"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")]

注意:对于 python 3.X 使用,替换iteritems()items()并且不要忘记添加()for print

于 2012-05-29T09:03:28.433 回答
10

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

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

dpath 允许您在键上使用 glob 语法搜索字典,并过滤值。你想要的是微不足道的:

$ 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
于 2013-05-12T14:16:25.777 回答
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)]
于 2012-05-29T09:01:48.807 回答
4

您可以使用“re”和“filter”的组合。例如,如果您想在 os 模块中搜索哪些方法的方法名称中包含“stat”一词,您可以使用下面的代码。

import re 
import os
r = re.compile(".*stat.*")
list(filter(r.match, os.__dict__.keys()))

结果是:

['stat', 'lstat', 'fstat', 'fstatvfs', 'statvfs', 'stat_result', 'statvfs_result']

我认为原始问题中的性能问题是使用“re”模块找到键后的 key_value 搜索。如果密钥的一部分是可互换的,我们就不能使用“startswith”。所以“re”是一个不错的选择。另外,我使用过滤器获取所有匹配键的列表并列出它们,以便我们可以使用简单的 [DICT[k] for k in LIST] 返回所有值。

于 2021-02-05T15:16:26.247 回答
0

就像我如何为以'seller_account'开头的密钥设置重新

reObj = re.compile('seller_account')

应该:

reObj = re.compile('seller_account.*')
于 2021-12-28T19:01:05.323 回答