【问题标题】:Find the string from a list that contains multiple patterns从包含多个模式的列表中查找字符串
【发布时间】:2022-01-16 21:22:09
【问题描述】:
str_list = ['Alex is a good boy',
            'Ben is a good boy',
            'Charlie is a good boy']
matches = ['Charlie','good']

我想返回str_list 中的第三个元素,因为它同时包含“Charlie”和“good”。

我试过了:

[s for s in str_list if all([m in s for m in matches])][0]

但这对我来说似乎过于冗长。请提供更优雅的解决方案。


根据下面的答案和 cmets,我们有:

next(s for s in str_list if all(m in s for m in matches))

它显然更快(尽管有一点点)而且更整洁。

【问题讨论】:

  • 你的解决方案对我来说看起来很优雅!
  • 小点:你可以把括号放在all(...)里面。

标签: python string match list-comprehension


【解决方案1】:

我会使用filter 函数,它返回一个迭代器,因此如果与next 一起使用,它将在第一次匹配时停止

next(filter(lambda s: all(m in s for m in matches), str_list))

@Timus 建议的更清晰的方法

next(s for s in str_list if all(m in s for m in matches))

【讨论】:

  • 很好地使用了next。但是next(s for s in str_list if all(m in s for m in matches)) 不是更 Pythonic 吗?
  • 我也喜欢!似乎是一场大辩论:stackoverflow.com/questions/3013449/…
  • 我想说Guido van Rossum - Python 的创造者 - 已经解决了这个问题:)): “大约 12 年前,Python 获得了 lambda、reduce()、filter() 和 map (),感谢(我相信)一个错过了它们并提交了工作补丁的 Lisp 黑客。但是,尽管有 PR 价值,我认为这些功能应该从 Python 3000 中删除。”
  • @Timus 如果您使用next(s for s in str_list if all(m in s for m in matches)) 添加答案,我会标记它。这正是我模糊的想法,但未能明确表述。
  • @JingweiYu 谢谢!如果你能标记曼德拉的回答,我更愿意。 next 来自他。也许他可以将我评论中的版本添加到答案中。
猜你喜欢
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 2023-01-12
相关资源
最近更新 更多