模式匹配在列表中的任意位置查找模式

Pattern matching find pattern anywhere in list

我有以下字典,如果 "status""progress",我想获取 "msg" 的值。 status "progress" 或 key "msg" 可能在字典中也可能不在字典中,这就是为什么我想到使用模式匹配来查看我是否可以得到我想要的。

我的尝试

my_dict = {
    "outer": [
        {"status": "to do", "desc": [{"msg": "foo"}]},
        {"status": "progress", "desc": [{"msg": "bar"}]},
        {"status": "done", "desc": [{"msg": "baz"}]},
    ]
}

match my_dict:
    case {'outer': [{'status': 'progress', 'desc': [{'msg': x}]}]}:
        print(x)

我正在寻找类似 case {'outer': [*_, {'status': 'progress', 'desc': [{'msg': x}]}, *_]}: 的东西,但它不起作用 SyntaxError: multiple starred names in sequence pattern

我想要的输出(使用模式匹配)

bar

我可以通过类似下面的方式得到我想要的东西,但是我需要做一些检查以确保密钥存在。

for i in my_dict['outer']: # check every status
    if i['status'] == 'progress': # check if the status is "progress"
        if 'desc' in i:
            for j in i['desc']: # loop the values of "desc"
                if 'msg' in j: # if the msg is there get the value
                    x = j['msg']

出于好奇,我想知道是否有使用模式匹配解决此问题的方法。

我想您可以执行以下操作:

for info in my_dict["outer"]:
    match info:
        case {"status": "progress", "desc": [{"msg": msg}]}:
            print(msg)
            break
else:
    print("No Match")

如果保证值progress只会在my_dict['outer']中出现一次,那么可以在匹配之前预过滤item列表:

my_dict = {'outer': [{'status': 'to do', 'desc': [{'msg': 'foo'}]}, {'status': 'progress', 'desc': [{'msg': 'bar'}]}, {'status': 'done', 'desc': [{'msg': 'baz'}]}]}
match [i for i in my_dict['outer'] if i['status'] == 'progress']:
   case [{'status': _, 'desc': [{'msg': msg}]}]:
      print(msg)

输出:

'bar'