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

在Polars中如何用starts_with判断字符串是否匹配列表任意前缀?

检查字符串是否以列表中任意前缀开头的实现优化

你当前的代码确实能得到正确结果,但不是执行该检查的理想方式。下面先梳理你的实现,再给出更高效直观的方案:

你的现有实现

创建原始DataFrame

import polars as pl

df = pl.DataFrame({
    'a': ['https://abcd.com', 'https://youtube.com'], 
    'validation_urls': [
        ['https://abcd.com', 'https://efgh.com'], 
        ['https://abcd.com', 'https://efgh.com']
    ],
})

处理代码

df = df.with_columns(is_valid=pl.col('a').str.starts_with(pl.col('validation_urls').explode()))

输出结果

┌─────────────────────┬──────────────────────────────────────────┬──────────┐
│ a                   ┆ validation_urls                          ┆ is_valid │
│ ---                 ┆ ---                                      ┆ ---      │
│ str                 ┆ list[str]                                ┆ bool     │
╞═════════════════════╪══════════════════════════════════════════╪══════════╡
│ https://abcd.com    ┆ ["https://abcd.com", "https://efgh.com"] ┆ true     │
│ https://youtube.com ┆ ["https://abcd.com", "https://efgh.com"] ┆ false    │
└─────────────────────┴──────────────────────────────────────────┴──────────┘

现有实现的问题

你用explode()展开validation_urls列表后再匹配,Polars会自动将同一原始行的匹配结果聚合为最终的布尔值,但这个过程会生成临时拆分行,逻辑不够直观,当列表元素较多时还会额外消耗性能。

更优实现方案

直接对列表列做元素级匹配,再通过聚合判断是否存在任意匹配项:

写法一:用list.eval结合list.any

df = df.with_columns(
    is_valid=pl.col('validation_urls').list.eval(
        pl.col('a').str.starts_with(pl.element())
    ).list.any()
)

写法二:更简洁的list.any直接调用

df = df.with_columns(
    is_valid=pl.col('validation_urls').list.any(pl.col('a').str.starts_with(pl.element()))
)

这两种写法都不需要拆分列表,直接在每行内部完成所有前缀的匹配检查,逻辑清晰且性能更优,最终输出结果和你现有实现完全一致。

内容的提问来源于stack exchange,提问作者apostofes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:47:37