【问题标题】:How to keep track of whether all strings in a list have a specific string present in them?如何跟踪列表中的所有字符串是否都存在特定字符串?
【发布时间】:2017-01-13 00:40:58
【问题描述】:

我有一个字符串列表,我需要在其中搜索特定的子字符串,并且仅当列表中的每个字符串中都存在子字符串时才返回结果。我的第一个想法是创建一个布尔值列表,该列表与子字符串是否存在于列表中的每个较大字符串中相对应,然后编写另一个循环来检查该布尔值列表在每个索引处是否为 True。有人对更优雅、更高效的方法有什么建议吗?

谢谢!

【问题讨论】:

  • 一个列表理解应该可以做到。
  • all() 应该会有所帮助。

标签: python list boolean


【解决方案1】:

你可以使用all()in

l = ["pie", "lie", "die"]
all( ['ie' in x for x in l] )

以上版本可能会执行unnecessary checks

all( 'ie' in x for x in l )

【讨论】:

  • 不必要地使用 listcomp 可以防止短路。
  • 我编辑了答案,现在我必须搜索关于短路的问题:) 谢谢。
【解决方案2】:

我会使用内置的all 函数和generator expression 来避免创建一次性中间列表。由于代码可以表示为一行,因此我还使用lambda expression 来定义它,而不是通常的def function()

# define function via lambda
in_all = lambda strings, specific: all(specific in strng for strng in strings)
in_all.__doc__ = """ Check whether all strings in list contain specified string. """

l1 = ["day", "lay", "may"]
l2 = ["day", "lay", "may", "not"]

print(in_all(l1, "ay"))  # -> True (all had specific string)
print(in_all(l2, "ay"))  # -> False (at least one didn't have
                         #           the specific string)

【讨论】:

  • 使用 lambda 然后立即命名它通常是不受欢迎的,但是然后手动使用 dunder 来记录它?为什么不直接使用普通的函数语法?
  • 我不赞成使用 lamdas 来定义短函数,但你关于 doc 字符串的观点是有效的。我只是无缘无故地把它扔进去了——主要是为了证明这个对象是一个函数——大多数人可能从不打扰,而且大多数简短的函数也不需要一个。
猜你喜欢
  • 1970-01-01
  • 2016-06-27
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 2015-10-03
  • 2016-09-18
相关资源
最近更新 更多