如何在python中检查两个字符串是否相交?
例如,a=“abcdefg”,b=“krtol”,它们没有交叉点,c=“hflsfjg”,那么a和c之间有交互作用。如何在python中检查两个字符串是否相交?,python,Python,例如,a=“abcdefg”,b=“krtol”,它们没有交叉点,c=“hflsfjg”,那么a和c之间有交互作用。 最简单的检查方法是什么?只需要一个正确或错误的结果您可以使用内置的集合类: a = set("abcdefg") b = set("krtol") c = set("hflsfjg") if a.intersection(b): # or simply a & b pass 因此,a和b有一个交叉点。是“f”。也许你应该定义“交叉点”的含义。@Constant
最简单的检查方法是什么?只需要一个正确或错误的结果您可以使用内置的
集合
类:
a = set("abcdefg")
b = set("krtol")
c = set("hflsfjg")
if a.intersection(b): # or simply a & b
pass
因此,
a
和b
有一个交叉点。是“f”。也许你应该定义“交叉点”的含义。@Constantinius对不起,我的错误。.你想让小写字母和大写字母相交还是不相交?实际上,你不需要对交叉点集调用len()。空的集合(或列表)将导致false,并使语句更具可读性。实际上,此解决方案可能具有较差的性能,因为您告诉Python创建交集只是为了检查它是否为空。如果这两组都有100万条记录并且相交90%呢?您将生成大量的对象,并立即再次丢弃这些对象。告诉Python您的意图基本上是更好的,因为它知道它不需要结果集,这给了它优化的机会。使用isdisjoint是一种更好的方法。@Haes:对len()
的调用不仅是多余的,而且还违反了Python的风格指南PEP 8,该指南明确禁止使用if len(…):
@SvenMarnach:我没有阅读PEP 8
,谢谢你的提示。更新了我的答案。性能可能与OP的用例无关。既然您在对康斯坦丁尼乌斯的回答的评论中开始讨论性能,我也要请您谈谈我的性能问题:为什么要费心将b
转换为集
<代码>集合(a)。isdisjoint(b)会更快。@sven我认为你的评论是到目前为止最好的答案+1@sven:当然你是对的,我的错。我只是想指出,计算一个完整的交点只是为了确定它们是否相交是个坏主意。当然是有效点。但是,如果没有必要,迭代整个b
也是一个坏主意。想象一下a
是“a”
,b
是以“a”
开头的一百万字符串。您的代码需要迭代所有b
,而我提出的变体可以在b
的第一个字符处退出(而set.isdisjoint()的实现实际上是这样的)。更好的优化方法是将较短的字符串转换为一个集合,并使用较长的字符串作为isdisjoint()
的参数。你可能不会相信,但我下班开车回家时也想到了类似的事情,但是答案就不再是一行了^^^我想底线是:对于小字符串来说,这可能无关紧要,对于大字符串来说,有很大的优化空间!
def hasIntersection(a, b):
return not set(a).isdisjoint(b)