字符串比较"逻辑"

ISW*_*ISW 6 language-agnostic string comparison

任何人都可以告诉我为什么下面的字符串比较会提供这些结果?

>>"1040"<="12000"  
True  
>> "1040"<="10000"  
False
Run Code Online (Sandbox Code Playgroud)

我已经在C和Python中尝试过字符串比较,结果显然是正确的,我只是无法弄清楚结果如何计算...

PS:我知道比较不同长度的字符串是你不应该做的事情,但我仍然想知道上述行背后的逻辑;-)

Ano*_*on. 23

"1"等于"1".

"0"出现在"2"之前(所以"1040"<"12000").

"4"在"0"之后出现(所以"1040">"10000").


jas*_*son 8

这里描述这种排序的奇特词是" 词典顺序 "(有时候是"词典顺序").在日常用语中,我们只是将其称为"字母顺序".这意味着我们首先在字母表中放置一个排序(A,B... Z,等),然后比较这个字母表中的两个单词,我们一次比较一个字符,直到我们在同一个字母中找到两个不相等的字符位置并返回这两个字符之间的比较.

示例:字母表中的"自然"排序{ A, B, C, ..., Z }A < B < C < ... < Z.鉴于这两个词s = s_1s_2...s_mt = t_1t_2...t_n我们比较s_1t_1.如果s_1 < t_1我们这样说s < t.如果s_1 > t_1我们这样说s > t.如果s_1 = t_1我们对单词s_2...s_m和单词进行说明t_2...t_n.为此,我们说空字符串少于所有非空字符串.

在过去,在Unicode之前,我们的符号的排序只是ASCII字符代码的排序.那么我们就有了0 < 1 < 2 < ... < 9 < ... < A < B < C < ... Z < ... < a < b < c < ... < z.在Unicode时代它更复杂,但同样的原则也适用.

现在,这意味着如果我们想比较1040,12000我们将使用以下内容:

1040比较12000等于040比较2000给出040 < 2000因为0 < 2最后,1040 < 12000.

1040比较10000等于040比较0000等于40比较000给出40 > 000因为4 > 0这样,最后,1040 > 10000.

这里的关键是这些是字符串,没有数字意义; 它们只是符号,我们对符号有一定的排序.也就是说,我们可以达到完全一样的答案,如果我们更换0A,1B,...,以及9通过J和说A < B < C < ... < J.(在这种情况下,我们会比较BAEABAAAABAEABCAAA.)


小智 6

想想按字母顺序排列.