在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
相关产品推荐
相关产品推荐

