关于python:整数的字符串表示的排序

Ordering of string representations of integers

本问题已经有最佳答案,请猛点这里访问。

这是我今天遇到的另一个大陷阱。

我花了几个小时调试我的代码,最后我发现它是由这个奇怪的设置引起的。

下面是我的python提示界面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
'3' > '2'
True
'4' > '3'
True
'15' > '11'
True
'999233' > '123'
True

# At this point, you must think compare string numbers is just like compare numbers.    
# Me too, but...

'5' > '15'
True

# What's this !!!???
# Meanwhile I am asking this question. I want to something exaggerated to mockerying
# this mechanism, and I find something surprised me:

'5' > '999233'
False

# What!!!???
# Suddenly an idea come across my mind, are they comparing the first string number
# at first, if they are equal and then compare the second one?
# So I tried:

'5' > '13333333333333333'
True
'5' > '61'
False

# That's it.
# my old doubt disappeared and a new question raised:

为什么他们设计了这样的机制而不是使用自然数比较机制?在"字符串数"比较中使用这种机制有什么好处?


你在比较字符串而不是数字。

20 > 9计算True的整数和浮点等数值类型,但使用词典比较(字符串),然后'20' < '9'计算True

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ python
>>> 5 > 10
False
>>> '5' > '10'
True
>>> '05' > '10'
False
>>> 'abc05' > 'bca10'
False
>>> 'dog' > 'cat'
True
>>> type('10')
<type 'str'>
>>> type(10)
<type 'int'>

实际上,字符'5'的ASCII值大于值'1',所以'5' > '15'的计算结果为True。因为字符串比较是逐字节的,就像字典中的单词长度不会影响它的位置一样,'5' > '1412423513515'也是True的位置。

1
2
3
4
5
6
>>> '5' > '15'
True
>>> ord('5')
53
>>> ord('1')
49

考虑整数的字符串表示,如字母字符,即'z' > 'abc'计算为True,因为'z''a'之后。这被称为词典编纂顺序。


这是一个词典编纂的比较。一旦发现一个大于另一个的元素,比较就会停止,因此

1
'5' > '15'

为真,因为"5"大于"1"


答案是将字符串从最左边的字符(或"词典编纂顺序")进行比较。这给出了直观的结果,例如,

1
"an" <"b" # True

如果要比较字符串所代表的数字的值,应明确说明:

1
int("15") < int("5") # False


它在比较起始数字。就好像它是按字母顺序排列的。5 > 1这就是为什么你要得到5 > 16的原因。


您正在比较字符串,因为您的数字被单引号包围。

在python中,应用于字符串的运算符使用字典顺序比较它们。您可以将"0"置于"5"之前进行测试:

1
'05' > '11'