64

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

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

我找到了这个解决方案:

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

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

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

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

任何想法?

4

4 回答 4

54

发布代码

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

str.join() 的替代方法

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

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

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

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

如果可以在搜索之前预先计算组合字符串,那么即使对于大型词表,操作员内搜索也将始终胜过任何方法。

使用集合的替代方法

如果预先计算了子字符串集并且我们不介意使用更多内存,则 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
于 2013-05-05T05:04:34.453 回答
44

如果它被其他一些替换,您可以导入any__builtin__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.

于 2013-05-05T00:50:26.513 回答
17

您可以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
于 2013-05-05T01:30:21.790 回答
0

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

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
于 2017-03-28T11:30:17.067 回答