web-dev-qa-db-ja.com

Pythonによって使用される文字列比較手法

Python文字列比較、具体的には、より小さい(_<_)またはより大きい(_>_)演算子が使用された場合の結果の決定方法を疑問に思っています。 。

たとえば、print('abc' < 'bac')と入力すると、Trueが取得されます。文字列の対応する文字を比較することを理解していますが、より良い用語がないため、aが最初の文字列ではなくb(最初の位置)よりも小さいという事実に置かれた「重み」がなぜあるのかは不明です2番目の文字列(2番目の位置)でaがbより小さいという事実。

48
davelupt

docs から:

比較は辞書式順序を使用します。最初の最初の2つの項目が比較され、それらが異なる場合、これが比較の結果を決定します。等しい場合、次の2つのアイテムが比較され、いずれかのシーケンスがなくなるまで続けられます。

また:

文字列の辞書式順序付けでは、Unicodeコードポイント番号を使用して個々の文字を順序付けます。

または Python 2

文字列の辞書式順序では、個々の文字にASCII順序を使用します。

例として:

>>> 'abc' > 'bac'
False
>>> ord('a'), ord('b')
(97, 98)

Falseaより小さいことが判明するとすぐに、結果bが返されます。それ以降の項目は比較されません(2番目の項目でわかるように、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)]
74
user225312

Python文字列比較は辞書式です:

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

文字列は、文字の等価な数値(組み込み関数ord()の結果)を使用して辞書式に比較されます。 Unicodeおよび8ビット文字列は、この動作で完全に相互運用可能です。

したがって、あなたの例では、'abc' < 'bac'、 'a'は数値的に(ASCIIおよびUnicode表現)で) 'b'の前(より小さい)に来るため、比較はそこで終了します。

8
wkl

Pythonと他のほぼすべてのコンピューター言語は、印刷された辞書でWordを見つけるときに使用するのと同じ原則を使用します(願っています)。

(1)関係する人間の言語に応じて、文字の順序付けの概念があります: 'a' <'b' <'c'など

(2)最初の文字は2番目の文字よりも重みがあります: 'az' <'za'(言語が左から右に書かれているか、右から左に書かれているか、boustrophedonはまったく無関係です)

(3)テストする文字がなくなった場合、短い文字列は長い文字列よりも短くなります: 'foo' <'food'

通常、コンピューター言語では、「文字の順序付けの概念」はかなり原始的です。各文字には人間の言語に依存しない番号ord(character)があり、文字はその番号を使用して比較およびソートされます。多くの場合、その順序付けはユーザーの人間の言語に適していないため、楽しいトピックである「照合」に入る必要があります。

7
John Machin

PythonでUnicode文字列をアルファベット順にソートするにはどうすればよいですか? も参照してください。ここでは、Unicode照合アルゴリズム( 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é -左の順序。

最後の発言:left-to-rightおよびright-to-leftについて話すべきではありませんソートではなくforwardおよびbackwardソート。

実際、右から左に書かれた言語があり、アラビア語とヘブライ語が右から左に分類されていると思うなら、グラフィカルな点から正しいかもしれません表示しますが、論理レベルでは間違っています!

確かに、Unicodeは論理的順序でエンコードされた文字列を考慮し、書き込み方向はグリフレベルで発生する現象です。言い換えれば、たとえ単語שלוinでlaの右側にshinという文字が表示されても、論理的に発生しますbeforeit。このWordをソートするには、最初にshin、次にlamed、次にvav、memの順に考えます。これはforwardの順序です(ただし、ヘブライ語は(右から左に記述)、フランス語のアクセントはbackwardsでソートされます(ただし、フランス語は左から右に記述されます)。

3
yannis

これは、 辞書順 です。物事を辞書順に並べるだけです。

3

純粋なPython文字列比較に相当するものは:

def less(string1, string2):
    # Compare character by character
    for idx in range(min(len(string1), len(string2))):
        # Get the "value" of the character
        ordinal1, ordinal2 = ord(string1[idx]), ord(string2[idx])
        # If the "value" is identical check the next characters
        if ordinal1 == ordinal2:
            continue
        # If it's smaller we're finished and can return True
        Elif ordinal1 < ordinal2:
            return True
        # If it's bigger we're finished and return False
        else:
            return False
    # We're out of characters and all were equal, so the result depends on the length
    # of the strings.
    return len(string1) < len(string2)

この関数は、実際のメソッド( Python 3.6 および Python 2.7 )と同等の処理をかなり遅くします。また、実装は正確に「Python」ではなく、<比較。それがどのように機能するかを説明するだけです。 結合されたユニコード文字 のPython比較のように動作するかどうかはチェックしていません。

より一般的なバリアントは次のとおりです。

from operator import lt, gt

def compare(string1, string2, less=True):
    op = lt if less else gt
    for char1, char2 in Zip(string1, string2):
        ordinal1, ordinal2 = ord(char1), ord(char1)
        if ordinal1 == ordinal2:
            continue
        Elif op(ordinal1, ordinal2):
            return True
        else:
            return False
    return op(len(string1), len(string2))
2
MSeifert

文字列 が比較されます 辞書的に 同等の数値(組み込み関数ord()の結果)を使用して、文字が比較されます。 Unicodeおよび8ビット文字列は、この動作で完全に相互運用可能です。

1
Senthil Kumaran

以下は、2つの文字列を辞書式に比較するサンプルコードです。

  a = str(input())
  b = str(input())
  if 1<=len(a)<=100 and 1<=len(b)<=100:
    a = a.lower()
    b = b.lower()
    if a > b:
       print('1')
    Elif a < b:
       print( '-1')
    Elif a == b:
       print('0') 

異なる入力の場合、出力は

1- abcdefg
   abcdeff
   1

2- abc
   Abc
   0

3- abs
   AbZ
  -1
0
Dlucidone