Python 3.x 通过部分键获取dict值

Python 3.x 通过部分键获取dict值,python-3.x,dictionary,Python 3.x,Dictionary,我希望通过键的一部分从字典中获取值,例如,我有一个带有复合键的dict tr_dict = {'UTABI-OSGAN': {"properties": {"id": "789"}}, 'ABOKA-OSGAN': {"properties": {"id": "111"}}, 'FE-DERIG': {"properties": {"id": "243"}}} 我想用key start来获取值'UTABI'(另一种情况是,当key end时使用例如'DERIG')

我希望通过键的一部分从字典中获取值,例如,我有一个带有复合键的
dict

tr_dict = {'UTABI-OSGAN': {"properties": {"id": "789"}},
       'ABOKA-OSGAN': {"properties": {"id": "111"}},
       'FE-DERIG': {"properties": {"id": "243"}}}
我想用key start来获取值
'UTABI'
(另一种情况是,当key end时使用例如
'DERIG'

我想它看起来像

start = 'UTABI' 
tr_dict.get(start + '[-A-Z]{2,5}')

我知道这种语法不正确,但有可能这样做吗?

这里有一种方法

return_values = {k:v for k,v in tr_dict.items() if k.startswith('UTABI') or k.endswith('DERIG')}
print(return_values)
产出:

{'UTABI-OSGAN': {'properties': {'id': '789'}}, 'FE-DERIG': {'properties': {'id': '243'}}}
这是一个扩展形式,它做同样的事情

return_values = []
for k,v in tr_dict.items():
    if k.startswith('UTABI') or k.endswith('DERIG'): # Change your requirements here
        return_values.append(v)

print(return_values)

您提出的语法被解释为“给我”UTABI[-A-Z]{2,5}键

当你想“按意图”过滤时,你可以说:

filtered_dict = {key: value for key, value in tr_dict if key.startswith('UTABI')}

简短回答:不。DICT不是SQL数据库,您必须给出确切的密钥

蛮力解决方案是循环dict的键,并使用字符串方法查找相关键,即:

for key in tr_dict:
    if key.startswith("UTABI-"):
        print("found {} : {}".format(key, tr_dict[key]))
这当然是O(n)和某种程度上的失败,这就是拥有dicts的全部意义。如果您只需要对给定的
tr_dict
执行一次此查找,则这是正常的,但是如果
tr_dict
具有较长的生命周期,并且将针对给定的“部分”键多次查找,则这是次优的

另一个需要更多前期处理但允许O(1)访问的解决方案是对整个dict进行一次预处理,以构建一个新的dict,其中包含可以直接查找的键:

from collections import defaultdict

lookups = [
   # (key: callback)
   ("UTABI", lambda k: k.startswith("UTABI-")),
   ("DERIG", lambda k: k.endswith("-DERIG")),
   ]

index = defaultdict(list)
for newkey, match in lookups:
    for oldkey in tr_dict:
        if match(oldkey):
            index[newkey].append(tr_dict[oldkey])

这对于一次查找来说太过分了,但是如果您必须为给定的tr_dict多次查找这些键,效果会更好。

WOW!这正是我需要的。伟大的事实上,我必须不止一次地在tru dict中搜索给定的“partial”键-每个循环tru dict都在扩展,如果我的“partial”键在键中,我就在其中搜索。非常感谢!