Python文字列比較、具体的には、より小さい(_<
_)またはより大きい(_>
_)演算子が使用された場合の結果の決定方法を疑問に思っています。 。
たとえば、print('abc' < 'bac')
と入力すると、True
が取得されます。文字列の対応する文字を比較することを理解していますが、より良い用語がないため、aが最初の文字列ではなくb(最初の位置)よりも小さいという事実に置かれた「重み」がなぜあるのかは不明です2番目の文字列(2番目の位置)でaがbより小さいという事実。
docs から:
比較は辞書式順序を使用します。最初の最初の2つの項目が比較され、それらが異なる場合、これが比較の結果を決定します。等しい場合、次の2つのアイテムが比較され、いずれかのシーケンスがなくなるまで続けられます。
また:
文字列の辞書式順序付けでは、Unicodeコードポイント番号を使用して個々の文字を順序付けます。
または Python 2 :
文字列の辞書式順序では、個々の文字にASCII順序を使用します。
例として:
>>> 'abc' > 'bac'
False
>>> ord('a'), ord('b')
(97, 98)
False
がa
より小さいことが判明するとすぐに、結果b
が返されます。それ以降の項目は比較されません(2番目の項目でわかるように、b
> a
はTrue
です)。
小文字と大文字に注意してください:
>>> [(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)]
Python文字列比較は辞書式です:
From Python Docs: http://docs.python.org/reference/expressions.html
文字列は、文字の等価な数値(組み込み関数ord()の結果)を使用して辞書式に比較されます。 Unicodeおよび8ビット文字列は、この動作で完全に相互運用可能です。
したがって、あなたの例では、'abc' < 'bac'
、 'a'は数値的に(ASCIIおよびUnicode表現)で) 'b'の前(より小さい)に来るため、比較はそこで終了します。
Pythonと他のほぼすべてのコンピューター言語は、印刷された辞書でWordを見つけるときに使用するのと同じ原則を使用します(願っています)。
(1)関係する人間の言語に応じて、文字の順序付けの概念があります: 'a' <'b' <'c'など
(2)最初の文字は2番目の文字よりも重みがあります: 'az' <'za'(言語が左から右に書かれているか、右から左に書かれているか、boustrophedonはまったく無関係です)
(3)テストする文字がなくなった場合、短い文字列は長い文字列よりも短くなります: 'foo' <'food'
通常、コンピューター言語では、「文字の順序付けの概念」はかなり原始的です。各文字には人間の言語に依存しない番号ord(character)
があり、文字はその番号を使用して比較およびソートされます。多くの場合、その順序付けはユーザーの人間の言語に適していないため、楽しいトピックである「照合」に入る必要があります。
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でソートされます(ただし、フランス語は左から右に記述されます)。
これは、 辞書順 です。物事を辞書順に並べるだけです。
純粋な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つの文字列を辞書式に比較するサンプルコードです。
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