可能重复:
Python 使用的字符串比较技术
>>> "spam" < "bacon"
False
>>> "spam" < "SPAM"
False
>>> "spam" < "spamalot"
True
>>> "Spam" < "eggs"
True
问题:如何比较等长字符串。如果字符串长度不同怎么办,为什么“Spam”小于“eggs”?
可能重复:
Python 使用的字符串比较技术
>>> "spam" < "bacon"
False
>>> "spam" < "SPAM"
False
>>> "spam" < "spamalot"
True
>>> "Spam" < "eggs"
True
问题:如何比较等长字符串。如果字符串长度不同怎么办,为什么“Spam”小于“eggs”?
词法上。
比较第一个字节,如果第一个字节的序数值小于第二个字节,则它更小。如果更多,那就更大了。如果它们相同,则尝试下一个字节。如果是所有关系并且一个较长,则较短的一个较小。
>>> "a" < "zzz"
True
>>> "aaa" < "z"
True
>>> "b" < "a"
False
>>> "abc" < "abcd"
True
>>> "abcd" < "abce"
True
>>> "A" < "a"
True
>>> ord("A")
65
>>> ord("a")
97
由于在 ASCII 表中A
出现在前面,因此in被认为比in小。a
S
Spam
e
eggs
>>> "A" < "a"
True
>>> "S" < "e"
True
>>> "S" < "eggs"
True
请注意,比较中不考虑字符串长度。正如@MikeGraham 在下面的评论中正确指出的那样,从第一个字节开始比较每个字节的序数值。一旦发现不匹配,比较就会停止,并返回比较值,如上一个示例所示。
来自文档 - 比较序列和其他类型: -
比较使用字典顺序:首先比较前两项,如果它们不同,则确定比较的结果;如果它们相等,则比较接下来的两项,依此类推,直到任一序列用完。
还在同一段中进一步: -
字符串的字典顺序使用单个字符的 ASCII 顺序
Python 中的字符串是按字典顺序排列的,因此它们可以进行逻辑排序:
>>> print sorted(['spam','bacon','SPAM','spamalot','Spam','eggs'])
['SPAM', 'Spam', 'bacon', 'eggs', 'spam', 'spamalot']
对此有一些妥协,主要是使用 unicode。字母é
将在字母之后排序z
,例如:
>>> 'e' < 'z'
True
>>> 'é' < 'z'
False
幸运的是,您可以使用排序函数、使用locale
字符串或字符串的子类来对字符串进行任何您希望的排序。
这是一个字典比较。