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: |
为什么他们设计了这样的机制而不是使用自然数比较机制?在"字符串数"比较中使用这种机制有什么好处?
你在比较字符串而不是数字。
例子:
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'> |
实际上,字符
1 2 3 4 5 6 | >>> '5' > '15' True >>> ord('5') 53 >>> ord('1') 49 |
。
考虑整数的字符串表示,如字母字符,即
这是一个词典编纂的比较。一旦发现一个大于另一个的元素,比较就会停止,因此
1 | '5' > '15' |
号
为真,因为"5"大于"1"
答案是将字符串从最左边的字符(或"词典编纂顺序")进行比较。这给出了直观的结果,例如,
1 | "an" <"b" # True |
如果要比较字符串所代表的数字的值,应明确说明:
1 | int("15") < int("5") # False |
。
它在比较起始数字。就好像它是按字母顺序排列的。
您正在比较字符串,因为您的数字被单引号包围。
在python中,应用于字符串的运算符使用字典顺序比较它们。您可以将"0"置于"5"之前进行测试:
1 | '05' > '11' |