【问题标题】:how to check if two strings have intersection in python?如何检查两个字符串在python中是否有交集?
【发布时间】:2011-10-24 15:30:39
【问题描述】:

比如a = "abcdefg", b = "krtol",它们没有交集,c = "hflsfjg",那么a和c有交集。
检查这个最简单的方法是什么?只需要一个真假结果

【问题讨论】:

  • 恕我直言,ab 有一个交集。是'f'。也许您应该定义“交叉点”的含义。
  • @Constantinius 对不起,我的错误..
  • 你想让小写和大写字母相交还是脱节?

标签: python


【解决方案1】:
def hasIntersection(a, b):
        return not set(a).isdisjoint(b)

【讨论】:

  • 性能可能与 OP 的用例无关。既然您开始在您对康斯坦丁尼乌斯的回答的评论中讨论性能,我也会对您进行性能分析:为什么还要将b 转换为setset(a).isdisjoint(b) 会更快。
  • @sven 我认为你的评论是迄今为止最好的答案
  • +1 @sven:你当然是对的,我的错。只是想指出,仅仅为了确定它们是否相交而计算整个交点是一个坏主意。
  • 当然是有效点。但如果没有必要,遍历整个b 也是一个坏主意。想象一下a"a"b 是一个以"a" 开头的一百万个字符的字符串。您的代码需要遍历所有b,而我提出的变体可以在b 的第一个字符上退出(实际上set.isdisjoint() 的实现确实如此)。更好的优化是将较短的字符串转换为一个集合,并将较长的字符串用作isdisjoint() 的参数。
  • 你可能不会相信,但我下班开车回家的时候也想过类似的事情,但答案就不再是单线了^^我猜底线是: 对于小字符串可能没关系,对于大字符串有很大的优化空间!
【解决方案2】:

您可以使用内置的set 类:

a = set("abcdefg")
b = set("krtol")
c = set("hflsfjg")

if a.intersection(b): # or simply a & b
    pass

【讨论】:

  • 实际上,你不需要在交集上调用 len() 。空集(或列表)将导致 false 并使语句更具可读性。
  • 实际上,这种解决方案可能性能不佳,因为您告诉 Python 创建交集只是为了检查它是否为空。如果两个集合都有 100 万条记录并且相交 90% 会怎样?您正在生成大量要立即丢弃的对象。基本上,告诉 Python 你的意图更好,因为它知道它不需要结果集,给它优化的机会。使用 isdisjoint 是更好的方法。
  • @Haes:对len() 的调用不仅是多余的,而且还违反了Python 的样式指南PEP 8,该指南明确不鼓励使用if len(...):
  • @SvenMarnach:我没有阅读PEP 8,感谢您的提示。更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 2021-01-11
  • 2017-07-07
  • 1970-01-01
  • 2014-06-23
  • 2022-06-19
  • 2019-11-07
相关资源
最近更新 更多