通过关键Python的一部分获取dict值

时间:2018-11-08 08:57:17

标签: python-3.x dictionary

我想通过键的一部分从字典中获取价值,例如我有一个带有复合键的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}')

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

3 个答案:

答案 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')}