检查字符串的任何(所有)字符是否在给定范围内

Mik*_*Sam 3 python string unicode performance python-3.x

我有一个包含unicode符号(cyrillic)的字符串:

myString1 = '???????'
myString2 = 'Austri?'
Run Code Online (Sandbox Code Playgroud)

我想检查字符串中的所有元素是否都是英文(ASCII).现在我正在使用循环:

for char in myString1:
    if ord(s) not in range(65,91):
         break
Run Code Online (Sandbox Code Playgroud)

因此,如果我找到第一个非英语元素,我就会打破循环.但是对于给定的示例,您可以看到字符串最后可以包含许多英文符号和unicode.通过这种方式,我将检查整个字符串.此外,如果所有的字符串都是英文的,我仍然会检查每个字符.

有没有更有效的方法来做到这一点?我正在考虑这样的事情:

if any(myString[:]) is not in range(65,91)
Run Code Online (Sandbox Code Playgroud)

sch*_*ggl 8

您可以使用set(O(1)包含检查)加快检查速度,特别是如果要检查相同范围的多个字符串,因为初始集创建也需要一次迭代.然后all,您可以使用比any此处更适合的早期迭代模式:

import string

ascii = set(string.ascii_uppercase)
ascii_all = set(string.ascii_uppercase + string.ascii_lowercase)

if all(x in ascii for x in my_string1):
    # my_string1 is all ascii
Run Code Online (Sandbox Code Playgroud)

当然,任何all构造都可以转换为any通过DeMorgan定律:

if not any(x not in ascii for x in my_string1):
    # my_string1 is all ascii
Run Code Online (Sandbox Code Playgroud)

更新:

一个很好的基于纯集的方法,不需要Artyer所指出的完整迭代:

if ascii.issuperset(my_string1):
    # my_string1 is all ascii
Run Code Online (Sandbox Code Playgroud)

  • @Mikhail_Sam在算法上,我的解决方案应该更好,因为[Daniel Sanchez'](/sf/users/118662071/)设置字符串的转换将始终迭代整个字符串,而我的第一个字符串将会中断非ascii char.我猜这是否真的重要或者设置操作的C优化是否取决于你的数据. (2认同)