如何检查字符串a是否为字符串b的子串但不相等?

3

我知道如果我们想知道字符串 a 是否包含在 b 中,我们可以使用以下方法:

a in b

当a等于b时,上述表达式仍然返回True。我希望有一个表达式,在a==b时返回False,并且当a是b的子字符串时返回True。因此我使用了以下表达式:
a in b and a != b

我想知道Python中是否有一种更简单的表达方式,可以以相同的方式工作?


8
那非常简单明了。 - Scott Hunter
如果a不在b的开头,你可以尝试b.find(a) > 0。但如果a可能在b的开头,那么这个方法就行不通了 :) - Jean-François Fabre
3个回答

4

不确定在Python中直接字符串比较的效率如何,但是假设它们是O(n),这应该是相当高效且易读的:

len(a) < len(b) and a in b

与其他答案一样,它的时间复杂度也是O(n),但长度操作应该是O(1)。它也更适合处理边缘情况(例如a大于b)。

1
这将是一个简短的答案,但它就是这样。你拥有的已经足够了。虽然可能会有其他选择,但你的方法足够易懂、简单且比其他任何方法更易读(当然这是每个人主观看法)。在我看来,Python 中不存在一种与此相同工作方式的更简单的表达式。这只是我个人对这个主题的看法。通常我会遵循KISS原则:
引用块中写道:“KISS 原则指出,大多数系统如果保持简单而不是变得复杂,则效果最佳;因此,在设计中应该把简单作为一个关键目标,并避免不必要的复杂性。”
例如,另一个答案与明确的and没有任何不同,而使用in==时链接可能会令人困惑,因为许多人会将其视为(a1 in b) != a1,至少乍一看是这样。

0

b.find(a) > 0 or b.startswith(a) and len(b) > len(a)

我并不是说这是最好的答案,只是另一种解决方案。原帖作者的陈述和任何其他答案一样好。被采纳的答案也很好。但这个答案确实可行,并展示了解决问题的不同方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接