模式匹配在列表中的任意位置查找模式
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'
我有以下字典,如果 "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'