排序整数的字符串表示

时间:2014-03-16 11:17:51

标签: python

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

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

下面是我的python提示界面

'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:

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

6 个答案:

答案 0 :(得分:7)

您正在比较字符串而不是数字。

20 > 9评估True的数字类型,如整数和浮点数,但lexicographical比较(字符串),然后'20' < '9'求值为{{1} }}

示例:

True

答案 1 :(得分:3)

这是一种词典比较。一旦找到大于另一个元素的元素,比较就会停止,所以

'5' > '15'

是真的,因为&#39; 5&#39;大于&#39; 1&#39;

答案 2 :(得分:3)

确实,'5'字符的ascii值大于值'1',因此'5' > '15'评估为True。由于字符串比较是逐字节的,就像字典中单词的长度不会影响它的位置'5' > '1412423513515'也是True

>>> '5' > '15'
True
>>> ord('5')
53
>>> ord('1')
49

考虑整数的字符串表示形式,如字母字符,'z' > 'abc'评估为True,因为'z'位于'a'之后。这称为lexicographic ordering

答案 3 :(得分:1)

答案是从最左边的字符或“词典排序”比较字符串。这给出了直观的结果,例如

"an" < "b" # True

如果你想比较字符串所代表的数字的,你应该明确这一点:

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

答案 4 :(得分:0)

您正在比较字符串,因为您的数字被单引号括起来。

在python&lt;和&gt;应用于字符串的运算符使用字典顺序对它们进行比较。 你可以测试一下这个&#39; 0&#39; 0之前&#39; 5&#39;:

'05' > '11'

答案 5 :(得分:0)

它正在比较初始数字。就像它是按字母顺序排列的一样。 5 > 1这就是你获得5 > 16

的原因