检查子字符串是否在字符串列表中?

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

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

我找到了解决办法:

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


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

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

然而,结果是一个生成器函数,我无法找到获得 True值的方法。

知道吗?

96711 次浏览

你可以从 __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

注意,在 Python3__builtin__已被重命名为 builtins

你可以改用 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

发布代码

OP 使用 任何()发布的代码是正确的,应该可以工作。不过,“ worldlist”的拼写需要修正。

使用 str.join ()的替代方法

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

>>> wordlist = ['yellow','orange','red']
>>> combined = '\t'.join(wordlist)


>>> 'or' in combined
True
>>> 'der' in combined
False

对于简短的单词列表,这比使用 任何的方法快几倍。

如果在搜索之前可以预先计算 合并字符串,那么即使对于较大的单词列表,在运算符内搜索也总是优于 任何方法。

用集合交替方法

如果提前计算子串集,并且不介意使用更多的内存,那么 O (n)搜索速度可以降低到 O (1)。

预计步骤:

from itertools import combinations


def substrings(word):
for i, j in combinations(range(len(word) + 1), 2):
yield word[i : j]


wordlist = ['yellow','orange','red']
word_set = set().union(*map(substrings, wordlist))

快速 O (1)搜索步骤:

>>> 'or' in word_set
True
>>> 'der' in word_set
False

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

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