我一直在用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)
返回True
(因为d
和g
在stringB中)。
答案 0 :(得分:9)
使用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
答案 1 :(得分:4)
您可以使用set
和&这里的交叉口运营商:
>>> bool(set('abcdefg') & set('hijklmn'))
>>> bool(set('abcdefg') & set('dog'))
或稍微冗长但可能更高效的
>>> bool(set('abcdefg').intersection('hijklmn'))
(更快,因为第二个字符串之前未转换为集合。)
如果你需要获得所有常见字符,这是特别好的:
>>> set('abcdefg') & set('dog')
set(['d', 'g'])
如果你可以制作它的正则表达式字符类,请使用:
>>> import re
>>> bool(re.search('[abcdefg]', 'hijklmn'))
False
>>> bool(re.search('[abcdefg]', 'dog'))
True
现在,如果它是一个用户输入字符串,那么创建它的字符类可能有点棘手。
答案 2 :(得分:2)
将字符串转换为list,然后使用list comprehension检查列表中的每个字符。
stringA = 'abcdefg'
stringB = 'hijklmn'
print any([character in list(stringB) for character in list(stringA)])
答案 3 :(得分:2)
我会说最优雅的方式是使用set
:
>>> stringA = 'abcdefg'
>>> stringB = 'hijklmn'
>>> set(stringA).intersection(stringB)
set()
>>> stringA = 'dog'
>>> stringB = 'abcdefg'
>>> set(stringA).intersection(stringB)
{'d', 'g'}
还有一个额外的好处,就是告诉你可以在两个字符串中找到哪些字符。
答案 4 :(得分:0)
试试这个:
bool(set(a) & set(b))