我想通过键的一部分从字典中获取价值,例如我有一个带有复合键的dict
tr_dict = {'UTABI-OSGAN': {"properties": {"id": "789"}},
'ABOKA-OSGAN': {"properties": {"id": "111"}},
'FE-DERIG': {"properties": {"id": "243"}}}
我想从键'UTABI'
开始获取值(另一种情况是键以'DERIG'
结尾)
我想它看起来像
start = 'UTABI'
tr_dict.get(start + '[-A-Z]{2,5}')
我知道这种语法是不正确的,但是有可能这样做吗?
答案 0 :(得分:1)
简短的回答:不。字典不是SQL数据库,您必须提供确切的密钥。
蛮力解决方案是遍历字典的键,并使用字符串方法找到相关的键,即:
for key in tr_dict:
if key.startswith("UTABI-"):
print("found {} : {}".format(key, tr_dict[key]))
当然是O(n),并且在整个命令中都失败了。如果您只需要针对给定的tr_dict
进行一次此查找就可以了,但是如果tr_dict
的生命周期较长并且对于给定的“部分”键将被查找一次以上,则不是最佳选择
另一个需要更多前期处理但又允许O(1)访问的解决方案是对整个字典进行一次预处理,以使用可以直接查找的键来构建新字典:
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多次查找这些键,那就更好了。
答案 1 :(得分:0)
这是一种方法,
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)
答案 2 :(得分:0)
您建议的语法被解释为“给我“ UTABI [-A-Z] {2,5}”键”。
要过滤“按意图”时,您可以说:
filtered_dict = {key: value for key, value in tr_dict if key.startswith('UTABI')}