字符串是如何比较的?

97 投票
7 回答
164931 浏览
提问于 2025-04-16 10:40

我想知道Python是怎么进行字符串比较的,特别是当使用小于<或大于>这些符号时,它是怎么决定结果的。

比如说,如果我输入print('abc' < 'bac'),结果是True。我明白它是比较字符串中对应的字符,但我不太明白为什么在第一个字符串中ab小(在第一位)会更重要,而不是在第二个字符串中ab小(在第二位)。


很多人会问这个问题,尤其是当字符串里面包含数字的表示时,他们想按数字的大小来比较。简单的解决办法是先把这些值转换成数字。可以看看这个链接:如何将字符串解析为浮点数或整数?。如果在一个列表或其他集合中有多个数字,可以参考这个链接:如何在列表、字典等中收集重复计算的结果(或者如何复制一个修改过每个元素的列表)?来进行批量转换。

如果你想比较的字符串里面包含数字序列,并且希望把这些数字当作数字来处理(有时称为“自然排序”),可以查看这个链接:有没有内置函数可以进行字符串的自然排序?

7 个回答

8

Python和几乎所有其他计算机语言在查找打印字典中的单词时,使用的原则和你用的方式是一样的:

(1) 根据不同的语言,你会有一个字符排序的概念:比如'a' < 'b' < 'c'等等。

(2) 第一个字符比第二个字符更重要:比如'az' < 'za'(无论语言是从左到右写,还是从右到左,或者是其他方式,这都不重要)。

(3) 如果你没有更多的字符可以比较,短的字符串就比长的字符串小:比如'foo' < 'food'。

通常,在计算机语言中,“字符排序的概念”是比较简单的:每个字符都有一个不依赖于人类语言的数字 ord(character),然后用这个数字来比较和排序字符。很多时候,这种排序方式并不适合用户的语言,这时候你就需要了解一下“整理”这个有趣的话题。

13

在Python中,字符串的比较是按照字典顺序进行的:

根据Python文档:http://docs.python.org/reference/expressions.html

字符串的比较是通过它们字符的数字值(可以通过内置函数ord()得到)来进行的。Unicode和8位字符串在这方面是完全兼容的。

所以在你的例子中,'abc' < 'bac',因为字母'a'在数字上(在ASCII和Unicode表示中)比'b'小,所以比较在这里就结束了。

125

来自文档的内容:

比较是按照字典顺序进行的:首先比较前两个元素,如果它们不同,就可以确定比较的结果;如果相同,就继续比较下一个两个元素,依此类推,直到其中一个序列比较完。

另外:

字符串的字典顺序是根据Unicode编码点的数字来排列每个字符的。

或者在Python 2中:

字符串的字典顺序是根据ASCII编码来排列每个字符的。

举个例子:

>>> 'abc' > 'bac'
False
>>> ord('a'), ord('b')
(97, 98)

一旦发现a小于b,就会立即返回结果False。后面的元素就不再比较了(就像你看到的第二个元素:b > aTrue)。

注意大小写的区别:

>>> [(x, ord(x)) for x in abc]
[('a', 97), ('b', 98), ('c', 99), ('d', 100), ('e', 101), ('f', 102), ('g', 103), ('h', 104), ('i', 105), ('j', 106), ('k', 107), ('l', 108), ('m', 109), ('n', 110), ('o', 111), ('p', 112), ('q', 113), ('r', 114), ('s', 115), ('t', 116), ('u', 117), ('v', 118), ('w', 119), ('x', 120), ('y', 121), ('z', 122)]
>>> [(x, ord(x)) for x in abc.upper()]
[('A', 65), ('B', 66), ('C', 67), ('D', 68), ('E', 69), ('F', 70), ('G', 71), ('H', 72), ('I', 73), ('J', 74), ('K', 75), ('L', 76), ('M', 77), ('N', 78), ('O', 79), ('P', 80), ('Q', 81), ('R', 82), ('S', 83), ('T', 84), ('U', 85), ('V', 86), ('W', 87), ('X', 88), ('Y', 89), ('Z', 90)]

具体来说,这意味着'a' > 'A''b' > 'B',等等,包括'a' > 'Z',这些都会评估为True,因为所有小写字母从a到z的编码点数字都比所有大写字母要大。

撰写回答