【问题标题】:Check if substring is in a list of strings?检查子字符串是否在字符串列表中?
【发布时间】:2013-04-29 02:54:30
【问题描述】:

我之前已经找到了这个问题的一些答案,但是对于当前的 Python 版本来说它们似乎已经过时了(或者至少它们对我不起作用)。

我想检查一个子字符串是否包含在字符串列表中。我只需要布尔结果。

我找到了这个解决方案:

word_to_check = 'or'
wordlist = ['yellow','orange','red']

result = any(word_to_check in word for word in worldlist)

我希望从这段代码中得到一个True 值。如果单词是“der”,那么输出应该是False

但是,结果是生成器函数,我找不到获取True 值的方法。

有什么想法吗?

【问题讨论】:

  • 您发布的代码运行良好(wordlist/worldlist 除外)。我猜你之前尝试过 any() 呼叫时忘记了。
  • 我错过了你已经使用了any
  • 查看您的代码和 cmets,我认为问题在于我正在使用的“任何”函数。它可能是 numpy 模块中的 any 函数。所以解决方案是改用内置函数,但是一旦导入了 numpy 模块,你知道如何做到这一点吗?
  • 当我使用ipython --pylab 时,这个问题一直出现在我身上,它“有用地”为您从 numpy 导入 *。在这种情况下,您可以直接使用 __builtin__.any 而无需像 Ashwini 的回答中那样导入 __builtin__,因为 __builtin__ 会自动显示在交互式 shell 中。还有@DSM:显然numpy.any 的行为在1.7 中发生了变化(变得更糟)。
  • 另外,请参阅下面的新答案,该答案通过将单词组合成单个字符串显示了一种更快的替代方法。

标签: python string list


【解决方案1】:

您可以改用next

colors = ['yellow', 'orange', 'red'] 
search = "or"

result = next((True for color in colors if search in color), False)

print(result) # True

显示包含子字符串的字符串:

colors = ['yellow', 'orange', 'red'] 
search = "or"

result = [color for color in colors if search in color]  

print(result) # Orange

【讨论】:

  • 这看起来是用子字符串查找对象的好方法,也可以用于 True/False 目标检查结果数组的长度。
【解决方案2】:

另外,如果有人想检查字典的任何值是否作为字符串列表中的子字符串存在,可以使用这个:

list_a = [
    'Copy of snap-009ecf9feb43d902b from us-west-2',
    'Copy of snap-0fe999422014504b6 from us-west-2',
    'Copy of snap-0fe999422014cscx504b6 from us-west-2',
    'Copy of snap-0fe999422sdad014504b6 from us-west-2'
]
dict_b = {
    '/dev/xvda': 'snap-0fe999422014504b6',
    '/dev/xvdsdsa': 'snap-sdvcsdvsdvs'
}

for b1 in dict_b.itervalues():
    result = next( ("found" for a1 in a if b1 in a1), "not found")
    print result 

打印出来

not found
found

【讨论】:

    【解决方案3】:

    您可以从__builtin__ 导入any,以防它被其他any 替换:

    >>> from  __builtin__ import any as b_any
    >>> lst = ['yellow', 'orange', 'red']
    >>> word = "or"
    >>> b_any(word in x for x in lst)
    True
    

    请注意,在 Python 3 中,__builtin__ 已重命名为 builtins

    【讨论】:

    • 如果使用列表组合而不是生成器,您可以使用 numpy.any 解决此问题:np.any([word in x for x in lis])
    • @MarkTolonen np.any 会很慢,因为它首先生成整个列表。
    • 相对较慢,是的,明显较慢...只有 OP 可以说,但不是他的例子 :)
    【解决方案4】:

    您使用 any() 发布的代码是正确的,应该可以正常工作,除非您在某处重新定义它。

    也就是说,通过对单个组合字符串使用子字符串搜索有一个简单而快速的解决方案:

    >>> wordlist = ['yellow','orange','red']
    >>> combined = '\t'.join(wordlist)
    
    >>> 'or' in combined
    True
    >>> 'der' in combined
    False
    

    这应该比使用 any 的方法快很多。连接字符可以是单词列表中某个单词中没有出现的任何字符。

    【讨论】:

    • 这是迄今为止我认为最有用和最简单的解决方案。也可以缩短为一行:'or' in '\t'.join(wordlist)
    • 比浏览列表并在每个项目上使用“in”表达式要快得多
    • 为什么使用 '\t' 而不是 ' '?
    • @NiharKarve 因为正在搜索的字符串更有可能包含“?”比'\t'
    • @Raymond 虽然我同意 join 方法可能更清晰,但它比使用 any(<generator>) 快。充其量,它是相同的速度(当子字符串不在列表中时)。如果该单词存在于列表中,any 将短路并且不会检查列表的其余部分。对于非常大的列表,这可能比加入快几个数量级。
    猜你喜欢
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多