【问题标题】:Search a list of strings with a list of substrings使用子字符串列表搜索字符串列表
【发布时间】:2014-08-30 13:17:53
【问题描述】:

我有一个字符串列表,目前我可以同时搜索一个子字符串:

str = ['abc', 'efg', 'xyz']   

[s for s in str if "a" in s] 

正确返回

['abc']

现在假设我有一个子字符串列表:

subs = ['a', 'ef']

我想要一个类似的命令

[s for s in str if anyof(subs) in s] 

应该返回

['abc', 'efg']

【问题讨论】:

  • 您是否尝试过自己解决这个问题?也许创建一个辅助函数?您能否与我们分享您的尝试?
  • 你考虑过使用any吗?另外,不要将您自己的变量命名为 str

标签: python string list substring


【解决方案1】:

有点复杂,但你可以做到

[s for s in str if any([sub for sub in subs if sub in s])] 

【讨论】:

  • +1... 但这永远不会通过我的代码审查:P
  • 也不会超过我的,但是嘿,给人们他们所要求的。
  • 这非常尴尬 - 与any(sub in s for sub in subs)相比
  • 在许多情况下你是正确的...查看this meta post 了解如何识别您的"give the people what they ask for." 位置可能不是正确路径的实例。
  • @jonrsharpe 哦,没想到。
【解决方案2】:
>>> s = ['abc', 'efg', 'xyz']  
>>> subs = ['a', 'ef']
>>> [x for x in s if any(sub in x for sub in subs)]
['abc', 'efg']

不要使用str 作为变量名,它是内置的。

【讨论】:

  • 有什么方法可以编辑它以便打印子字符串吗?即与(但它会是更有效的解决方案吗?)for i in range(len(subs)): for j in range(len(s)): if subs[i] in s[j]: print subs[i]
【解决方案3】:

只需一个接一个地使用它们:

[s for s in str for r in subs if r in s]

>>> r = ['abc', 'efg', 'xyz']   
>>> s = ['a', 'ef']
>>> [t for t in r for x in s if x in t] 
['abc', 'efg']

【讨论】:

  • 这对于s = ['a', 'ef', 'fg'] 将失败并返回['abc', 'efg', 'efg']
【解决方案4】:

我仍然喜欢mapfilter,尽管有人反对以及理解总是可以取代mapfilter。因此,这是一个map + filter + lambda 版本:

print filter(lambda x: any(map(x.__contains__,subs)), s)

内容如下:

过滤 s 中包含来自 subs 的任何元素的元素

我喜欢它使用带有强烈语义意义的词,而不仅仅是if, for, in

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2019-01-31
    • 2016-04-21
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多