如何使用Python模式匹配捕获包含指定字典项的任意列表?
使用Python模式匹配捕获包含特定字典的任意顺序列表
原代码及输出
原代码:
x = [ {"foo": "bar"}, {"bar": "baz"}, ] y = [ {"bar": "baz"}, {"foo": "bar"}, ] for item in (x, y): match item: case [{"foo": "bar"}, *other_items]: print(f"Caught {item}") case _: print(f"Did not catch {item}")
运行输出:
Caught [{'foo': 'bar'}, {'bar': 'baz'}] Did not catch [{'bar': 'baz'}, {'foo': 'bar'}]
解决方案
要让模式同时捕获x和y,可以利用Python模式匹配的**rest通配符*_**忽略任意位置的其他元素,修改后的模式为[*_, {"foo": "bar"}, *_]。这个模式表示:匹配任意数量的前置元素(包括0个),接着是目标字典{"foo": "bar"},最后匹配任意数量的后置元素(包括0个),从而覆盖目标字典在列表中的任意位置。
修改后的代码:
x = [ {"foo": "bar"}, {"bar": "baz"}, ] y = [ {"bar": "baz"}, {"foo": "bar"}, ] for item in (x, y): match item: case [*_, {"foo": "bar"}, *_]: print(f"Caught {item}") case _: print(f"Did not catch {item}")
运行输出:
Caught [{'foo': 'bar'}, {'bar': 'baz'}] Caught [{'bar': 'baz'}, {'foo': 'bar'}]
补充说明
如果你的列表固定只有两个元素,也可以用**模式或(|)**明确匹配两种顺序:
case [{"foo": "bar"}, {"bar": "baz"}] | [{"bar": "baz"}, {"foo": "bar"}]:
但这种方式仅适用于元素数量固定的场景,而[*_, {"foo": "bar"}, *_]通用性更强,能匹配任意长度、只要包含目标字典的列表。
内容的提问来源于stack exchange,提问作者fredrik
相关产品推荐
相关产品推荐

