我一直在用Python编程,但我能想到的所有方法都很长,我觉得一定有更好的方法。
有没有快速的方法(可能是1行或2行?):
if (stringA.containsAnyLetterIn(stringB)):
do stuff
例如,我想要
stringA = 'abcdefg'
stringB = 'hijklmn'
print stringA.containsAnyLetterIn(stringB)
返回False
,我想要
stringA = 'dog'
stringB = 'abcdefg'
print stringA.containsAnyLetterIn(stringB)
以返回CCD_ 2(因为d
和g
在字符串B中)。
使用any
函数和in
运算符,就像这个
any(char in stringB for char in stringA)
演示:
>>> stringA, stringB = 'abcdefg', 'hijklmn'
>>> any(char in stringB for char in stringA)
False
>>> stringA, stringB = 'dog', 'abcdefg'
>>> any(char in stringB for char in stringA)
True
如果你想要一个有效的解决方案,将stringA
转换为一个集合,然后检查集合和stringB
是否是disjoint
,就像这个一样
>>> stringA, stringB = 'abcdefg', 'hijklmn'
>>> not set(stringA).isdisjoint(stringB)
False
>>> stringA, stringB = 'dog', 'abcdefg'
>>> not set(stringA).isdisjoint(stringB)
True
您可以使用set
和&此处的交叉口操作员:
>>> bool(set('abcdefg') & set('hijklmn'))
>>> bool(set('abcdefg') & set('dog'))
或者稍显冗长但可能性能更高的
>>> bool(set('abcdefg').intersection('hijklmn'))
(更快,因为第二个字符串之前没有转换为集合)。
如果你需要获得所有常见的字符,这是特别好的:
>>> set('abcdefg') & set('dog')
set(['d', 'g'])
如果您可以将其创建regex字符类,请使用:
>>> import re
>>> bool(re.search('[abcdefg]', 'hijklmn'))
False
>>> bool(re.search('[abcdefg]', 'dog'))
True
现在,如果它是一个用户输入字符串,那么为它创建一个字符类可能有点棘手。
将字符串转换为列表,然后使用列表理解检查列表中的每个字符。
stringA = 'abcdefg'
stringB = 'hijklmn'
print any([character in list(stringB) for character in list(stringA)])
我认为最优雅的方法是使用set
:
>>> stringA = 'abcdefg'
>>> stringB = 'hijklmn'
>>> set(stringA).intersection(stringB)
set()
>>> stringA = 'dog'
>>> stringB = 'abcdefg'
>>> set(stringA).intersection(stringB)
{'d', 'g'}
另外的好处是告诉您哪些字符可以在两个字符串中找到。
试试这个:
bool(set(a) & set(b))