You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:00:23