一种有效的方法来检查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个字符;
  • 用第一个字符填充空间;
  • 比较两个字符串。

  • 字符串越长,时间奖励就越大。但是,正如mgilson所写,它会创建字符串的副本,因此,如果您的字符串长度为数百万个符号,则可能会出现问题。

    从计时结果可以看出,解决任务的最快方法通常不会为每个符号执行任何Python代码。但是,set()解决方案还可以在Python库的C代码中完成所有工作,但是它仍然很慢,可能是由于通过Python对象接口(interface)操作字符串。

    UPD:关于空字符串大小写。如何处理它很大程度上取决于任务。如果任务是“检查字符串中的所有符号是否都相同”,则s == len(s) * s[0]是有效答案(没有符号表示错误,可以使用异常)。如果任务是“检查是否存在唯一的唯一符号”,则空字符串应为False,答案为s and s == len(s) * s[0]bool(s) and s == len(s) * s[0](如果您希望接收 bool 值)。最后,如果我们将任务理解为“检查是否存在不同的符号”,则空字符串的结果为True,答案为not s or s == len(s) * s[0]

    关于python - 有效地检查字符串是否由Python中的一个字符组成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14320909/

    10-11 22:04
    查看更多