2011-01-26 5 views
36

Pythonが文字列の比較をどのように行うのか、より具体的には(<)以上の記号(>)が使用された場合の結果をどのように決定するのだろうかと思います。Pythonで使用される文字列比較手法

たとえば、print( 'abc' < 'bac')を入力した場合、私は正しいことになります。私はそれが文字列内の対応する文字を比較することを理解していますが、理由がわからないのはなぜですか?より良い用語がないために、aがbよりも小さい(最初の位置) aが第2列(第2位置)のbより小さいという事実。

+5

何?左から右以外の順序付けはどのように定義できますか? –

+3

@ S.Lott:右から左。誰もそうするつもりはないが、唯一の可能性ではない。 – katrielalex

+0

@katrielalex:これを許可すれば、ランダム、偶数、奇数のみ、その他のすべての可能性を許す必要があります。次に、オペレータがどのような順序を選択するかを「パラメータ化」する必要があります。デフォルトがある場合は、どうやって左から右へと変化するのでしょうか? –

答えて

62

docsから:比較は、辞書式順序 使用

:比較さ 最初の最初の2つの項目を、彼らはこれを異なる場合 は、比較の結果を決定します。等しい場合は、 の次の2つの項目が比較され、 がなくなるまで がオンになります。また

:文字列の

辞書的順序は、個々の文字を注文するのUnicodeコードポイントの数を使用しています。

Python 2上:文字列の

辞書的順序は、個々の文字のASCII順序を使用しています。例として

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

ab未満であることが見出されているようにFalseとすぐに戻される結果。それ以上の項目は比較されません(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)] 
+7

あるシーケンスが使い果たされた場合、そのシーケンスはより少なくなります: '' abc '<' abcd''。 – Noumenon

+0

ありがとう、これは数字の文字列にも機能することを追加するのに便利かもしれません。私はこの問題を 'ord'( "2") '=' 50' – Procyclinsur

+1

のせいで「24」> 40' = Trueとしていましたが、これは実際には起こりません。 Python 2では文字列と整数だけを比較できますが、[比較ロジックは異なります](https://stackoverflow.com/q/3270680)。 '" 24 ">" 40 "'(引用符に注意してください)は 'False'を返します。 – vaultah

8

Python文字列比較が辞書式である:Pythonのドキュメントから

http://docs.python.org/reference/expressions.html

文字列は、数値的等価物を(結果を使用して辞書と比較されます組み込み関数ord())の文字列を返します。 Unicodeと8ビットの文字列は、この動作で完全に相互運用可能です。あなたの例ではそのため

'abc' < 'bac'比較がすぐそこに終わるので、「」、(ASCIIおよびUnicode表現での)数値(小なり)「B」の前に来ます。

+0

それで、文字の1つが対応する文字よりも小さいとすぐに比較を終了しますか? – davelupt

+0

@David:はい。より小さいかより大きい。等しい場合、次の項目が比較されます。 – user225312

3

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

+0

辞書は大文字と小文字を区別しないので、実際には間違っています。たとえば、 ''a '>' z''は' True'で、 ''a'> 'Z'''は' False'です。 – seb

1

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

6

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

(1)関係する人間の言語に応じて、あなたが持っています文字の順序の概念:「」<「B」<「C」など

(2)最初の文字が二文字以上の重さがあります:「AZ」<「座」を(言語が書かれているかどうか、左対右または右から左または聴覚障害は全く無関係です)

(3) f 'の文字より短い文字列' foo '<' food '

通常、コンピュータ言語では、「文字順序の概念」は基本的ではなく、各文字は人間言語 - 非依存番号ord(character)と比較され、その数を使用して文字が比較されソートされます。その順序は、ユーザーの人間の言語には適切ではないことがよくあります。次に、楽しいトピックである「照合」に入る必要があります。

3

How do I sort unicode strings alphabetically in Python?もご覧ください。ここでは、Unicode照合アルゴリズム(http://www.unicode.org/reports/tr10/)で指定されたソートルールについて説明します。コメントに返信する

何?左から右以外の順序付けはどのように定義できますか?

S.Lottによると、フランス語をソートする際に有名な反例があります。それはアクセントを伴います:実際、フランス語では、文字は左から右に、アクセントは右から左にソートされています。ここでは反例である: 我々は電子<éを持っており、<〇〇、あなたがコテコート<コート<コート・<としてソートする言葉のコート、コート、コート・、コテを期待するようにします。まあ、これは実際にあなたが持っている、何が起こるかではありません。私たちは「C」と「t」を削除した場合にコート<コート・< COTE <コテを、すなわち、我々は正確に右にあるOE < OE < < OE OEを取得します - 左の注文。

そして最後の発言:あなたが前方とについて右から左へソートに左から右とではなく、むしろについての話をしてはならない後方ソート。

は確かに右から左に書かれた言語があるとあなたはアラビア語とヘブライ語を思えばは、ビューのグラフィカルな観点から正しいかもしれない右から左に並べ替えられていますが、論理レベルで間違っています!

実際、Unicodeはでエンコードされた文字列を論理的順序とみなし、書き込み方向はグリフレベルで発生する現象です。言い換えれば、たとえשלוםという言葉の中に手紙が薄板の右側に現れても、となります。それはの前にです。この言葉をソートするには、最初にひれ、次にひれ伏し、次にvav、次にmemを考えます。です(ヘブライ語は右から左に書かれていますが)。 (ただし、フランス語は左から右に書かれています)。

0

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 
2

をare-文字列比較のため、純粋な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 is False 
    return False 

この関数は、実際の方法の等価を行い(Python 3.6Python 2.7)の方がずっと遅いです。また、実装は正確に "pythonic"ではなく、<比較の場合にのみ機能することにも注意してください。どのように動作するかを説明するだけです。私はそれがcombined unicode charactersのPythonsの比較のように働くかどうかチェックしていない。

より一般的な変種は、次のようになります。

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 False