检查字符串

时间:2017-09-20 14:25:58

标签: python

我想检查一个字符串是否包含列表中的元素:

l = ['S', 'R', 'D', 'W', 'V', 'Y', 'H', 'K', 'B', 'M']

s = 'YTG'

第一个解决方案是:

for i in l:
    if i in s:
        print i

但这似乎效率低下。我尝试了以下代码,但它为我提供了列表'M'的最后一个元素,而不是'Y'

if any(i in s for i in l):
    print i

我想知道这里有什么问题?

谢谢!

3 个答案:

答案 0 :(得分:9)

any()生成TrueFalse,生成器表达式变量在表达式之外不可用:

>>> l = ['S', 'R', 'D', 'W', 'V', 'Y', 'H', 'K', 'B', 'M']
>>> s = 'YTG'
>>> any(i in s for i in l)
True
>>> i
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'i' is not defined

使用列表推导列出所有匹配的字母:

matching = [i for i in l if i in s]
if matching:
    print matching

保留l中的顺序;如果matching中的订单无关紧要,您可以使用设置的交叉点。我在这里设置了l

l = set(['S', 'R', 'D', 'W', 'V', 'Y', 'H', 'K', 'B', 'M'])  # Python 3 can use {...}
matching = l.intersection(s)
if matching:
    print matching

通过设置l集合,Python可以迭代较短的s字符串。

答案 1 :(得分:1)

any会告诉您条件是True还是False,而不会提供更多详细信息。

要计算实际的公共字母,只需创建一个set并执行交集:

l = ['S', 'R', 'D', 'W', 'V', 'Y', 'H', 'K', 'B', 'M']

s = set('YTG')
print(s.intersection(l))

产生{'Y'}

答案 2 :(得分:1)

一个班轮:

set(list(s)).intersection(set(l))

{'Y'}

根据@Martijn Pieters♦简单评论:

set(s).intersection(l)可以解决问题,如@ Jean-FrançoisFabre的回答所示