0

我遇到过提出两种解决方案的情况。

假设我有一个字符串“foo bar”作为输入,我需要检查它是否以“bar”结尾。

一个人的解决方案是这样的:

is_bar = lambda x: x[-3:] == "bar"

另一个人的解决方案是这样的:

is_bar = lambda x: x.endswith("bar")

任何人都可以深入了解两者之间的差异以及首选哪个?假设只有一个后缀“bar”是首选的,因为endswith可以有后缀的元组,如果有更多,那将是首选。

4

1 回答 1

2

endswith效率更高,因为它不需要额外的空间(除了两个字符串比较在内部使用的空间)并且可以在第一个不相等的字符处停止。而且您不需要提供长度。对于不太习惯切片符号的人来说,它可能更清楚。并且比 example 更清晰,更不容易出错x[-31:] == "toolongtoimmediatelyseethelength"

切片占用额外空间,甚至在比较第一个字符之前就已完全创建,您需要提供长度。但是,当您玩代码高尔夫时会更好。

如果潜在的结束字符串没有被硬编码,切片比较甚至有一个微妙的错误。虽然x[-1:]为您提供长度为 1 的后缀,x[-0:]不会为您提供长度为 0 的后缀,而是为您提供整个字符串。所以x[-len(s):] == s失败时s为空但x不是,它变成x[0:] == ''并导致False. 正确的结果是 trivially True,并x.endswith(s)得到它。我也只是在另一个答案中使用了它,在该答案中我不需要针对不重叠情况的特殊情况,但比较切片的答案确实如此。

于 2020-01-22T19:00:01.267 回答