检查 Python 中的字符串 s
是否仅包含一个字符(例如 'A'
)的有效方法是什么?像 all_equal(s, 'A')
这样的东西会表现得像这样:
all_equal("AAAAA", "A") = True
all_equal("AAAAAAAAAAA", "A") = True
all_equal("AAAAAfAAAAA", "A") = False
两种看似低效的方法是:首先将字符串转换为列表并检查每个元素,或者使用正则表达式。有没有更有效的方法,或者这些方法是 Python 中最好的方法吗?谢谢。
最佳答案
这是迄今为止最快的,甚至比 count()
还要快几倍,只需用出色的 mgilson's timing suite 计时即可:
s == len(s) * s[0]
这里所有的检查都是在 Python C 代码中完成的:
- 分配 len(s) 个字符;
- 用第一个字符填充空格;
- 比较两个字符串。
字符串越长,时间奖励就越大。但是,正如 mgilson 所写,它会创建字符串的副本,因此如果您的字符串长度为数百万个符号,则可能会成为问题。
从计时结果中我们可以看出,通常最快的解决任务的方法不会为每个符号执行任何 Python 代码。然而,set()
解决方案也完成了 Python 库的 C 代码内部的所有工作,但它仍然很慢,可能是因为通过 Python 对象接口(interface)操作字符串。
UPD:关于空字符串的情况。如何处理它很大程度上取决于任务。如果任务是“检查字符串中的所有符号是否相同”,则 s == len(s) * s[0]
是有效答案(没有符号表示错误,异常没问题)。如果任务是“检查是否只有一个唯一符号”,空字符串应该给我们 False,答案是 s and s == len(s) * s[0]
,或者 bool(s) 和 s == len(s) * s[0]
如果您更喜欢接收 bool 值。最后,如果我们把任务理解为“检查是否有不同的符号”,空字符串的结果是True,答案是not s or s == len(s) * s[0]
.
关于python - 有效地检查字符串是否由 Python 中的一个字符组成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14320909/