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”键在键中,我就在其中搜索。非常感谢!