我想检查一个字符串是否包含列表中的元素:
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
我想知道这里有什么问题?
谢谢!
答案 0 :(得分:9)
any()
生成True
或False
,生成器表达式变量在表达式之外不可用:
>>> 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的回答所示