Python使用的字符串比较技术

dav*_*upt 51 python string comparison

我想知道Python如何进行字符串比较,更具体地说,它是如何在使用小于(<)或大于(>)运算符时确定结果的.

例如,如果我把print('abc' < 'bac')我得到True.我理解它比较了字符串中的相应字符,但是由于缺乏更好的术语而不清楚为什么还有更多的字符,"权重"放在第一个字符串中的a小于b(第一个位置)而不是a在第二个字符串(第二个位置)中小于b的事实.

use*_*312 78

来自文档:

比较使用词典排序:首先比较前两个项目,如果它们不同,则确定比较的结果; 如果它们相等,则比较接下来的两个项目,依此类推,直到任一序列用完为止.

也:

字符串的字典顺序使用Unicode代码点编号来排序单个字符.

或者在Python 2上:

字符串的字典排序使用单个字符的ASCII排序.

举个例子:

>>> 'abc' > 'bac'
False
>>> ord('a'), ord('b')
(97, 98)
Run Code Online (Sandbox Code Playgroud)

False一旦a发现结果小于,就返回结果b.其他项目不进行比较(正如您可以看到的第二项: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)]
Run Code Online (Sandbox Code Playgroud)

  • 只是想补充一点,如果一个序列耗尽,那个序列就少了:''abc'<'abcd'`. (11认同)
  • 谢谢您,补充一下它也适用于数字字符串可能会很有用。我刚刚遇到这个问题 `"24" &gt; 4​​0` = `True` 由于 `ord("2")` = `50` (2认同)

wkl*_*wkl 8

Python字符串比较是词典:

来自Python Docs:http://docs.python.org/reference/expressions.html

使用字符的数字等价物(内置函数ord()的结果)按字典顺序比较字符串.Unicode和8位字符串在此行为中完全可互操作.

因此,在您的示例中'abc' < 'bac','a'以数字形式出现(小于)'b'(在ASCII和Unicode表示中),因此比较在那里结束.


Joh*_*hin 7

Python和几乎所有其他计算机语言都使用与我希望在打印字典中查找单词时相同的原则:

(1)根据所涉及的人类语言,你有一个字符排序的概念:'a'<'b'<'c'等

(2)第一个字符的重量大于第二个字符:'az'<'za'(语言是从左到右还是从右到左书写,或者boustrophedon是无关紧要的)

(3)如果用完要测试的字符,则较短的字符串小于较长的字符串:'foo'<'food'

通常,在计算机语言中,"字符排序的概念"是相当原始的:每个字符具有与人类语言无关的数字ord(character),并且使用该数字对字符进行比较和排序.通常这种排序不适合用户的人类语言,然后你需要进入"整理"这个有趣的话题.


yan*_*nis 5

请参阅如何在 Python 中按字母顺序对 unicode 字符串进行排序?其中讨论的是关于 Unicode Collat​​ion Algorithm ( http://www.unicode.org/reports/tr10/ )给出的排序规则。

回复评论

什么?除了从左到右之外,还可以如何定义排序?

由 S.Lott 撰写,在对法语进行排序时有一个著名的反例。它涉及重音:事实上,可以说,在法语中,字母从左到右排序,重音从右到左排序。这是反例:我们有 e < é 和 o < ô,所以你会期望单词 cote、coté、côte、côté 被排序为 cote < coté < côte < côté。好吧,这不是发生的事情,事实上你有:cote < côte < coté < côté,也就是说,如果我们去掉 "c" 和 "t",我们得到 oe < ôe < oé < ôé,这是完全正确的- 左排序。

最后一句话:你不应该谈论从左到右从右到左的排序,而应该谈论向前向后排序。

事实上,有些语言是从右到左书写的,如果你认为阿拉伯语和希伯来语是从右到左排序的,从图形的角度来看你可能是对的,但在逻辑层面上你是错的!

确实,Unicode 考虑的是按逻辑顺序编码的字符串,而书写方向是发生在字形级别的现象。换句话说,即使在字里行???字母 shin 出现在 lamed 的右边,逻辑上它出现之前。要对这个词进行排序,首先要考虑 shin,然后是 lamed,然后是 vav,然后是 mem,这是向前排序(尽管希伯来语是从右到左写的),而法语口音是向后排序的(尽管法语是从左到右写)。


归档时间:

查看次数:

78265 次

最近记录:

6 年,10 月 前