Pythonでタプル比較はどのように機能しますか?


178

私はCore Pythonプログラミングの本を読んでいて、著者は次のような例を示しています。

(4, 5) < (3, 5) # Equals false

だから、私は疑問に思っています、どのように/なぜfalseに等しいのですか?Pythonはこれら2つのタプルをどのように比較しますか?

ところで、それは本で説明されていません。

回答:


191

タプルは位置ごとに比較されます。最初のタプルの最初の項目が2番目のタプルの最初の項目と比較されます。それらが等しくない場合(つまり、最初のものが2番目より大きいか小さい場合)、それが比較の結果です。それ以外の場合は2番目の項目が考慮され、次に3番目の項目が考慮されます。

一般的なシーケンス操作を参照してください。

同じタイプのシーケンスも比較をサポートしています。特に、タプルとリストは、対応する要素を比較することによって辞書編集的に比較されます。つまり、等しいことを比較するには、すべての要素が等しいことを比較し、2つのシーケンスが同じタイプで、長さが同じである必要があります。

また、値の比較詳細については:

組み込みコレクション間の辞書式比較は次のように機能します。

  • 2つのコレクションを同等に比較するには、それらが同じ型で、長さが同じで、対応する要素の各ペアが同等に比較される必要があります(たとえば、 [1,2] == (1,2)があります型が同じでないためfalseです)。
  • 順序比較をサポートするコレクションは、最初の等しくない要素と同じ順序で並べられます(たとえば、[1,2,x] <= [1,2,y]と同じ値ですx <= y)。対応する要素が存在しない場合は、短い方のコレクションが最初に並べられます(たとえば、[1,2] < [1,2,3]true)。

等しくない場合、シーケンスは最初の異なる要素と同じ順序で並べられます。たとえば、cmp([1,2、x]、[1,2、y])は、cmp(x、y)と同じ結果を返します。対応する要素が存在しない場合、短いシーケンスは小さいと見なされます(たとえば、[1,2] <[1,2,3]はTrueを返します)。

注1:「より小」や「より大」を意味するの<>はなく、「より前」と「より後」を意味します。つまり、(0、1)「より前」(1、0)です。

注2:タプルは、長さに応じて、n次元空間のベクトルと見なしてはなりません。

注3:質問/programming/36911617/python-2-tuple-comparisonを参照:最初の要素が対応する要素よりも大きい場合にのみ、タプルが別のタプルより「大きい」とは考えないでください 1秒に1つ。


4
とについて話すとき、これは誤解を招く可能性が<あり>ます。たとえば、はに(0, 1) < (1, 0)評価されTrueます。
なし

4
@CMCDragonkai-はい。試してください:x = tuple([0 for _ in range(n)])yについても同じことを行います。n = 100、1000、10,000、および100,000を設定して実行%timeit x==yすると、それぞれ0.5、4.6、43.9、および443マイクロ秒のタイミング値が得られます。これは、実際に取得できるO(n)とほぼ同じです。
Michael Scott Cuthbert

8
@ J.Moneyなぜ誤解を招く可能性があると思いますか?
Don

1
@CharlieParkerは<>「次に小さい」、「大きい」を意味するのではなく、「前に来る」と「後に来る」を意味します。つまり、「前に(0, 1)来る」(1, 0)
Don

3
@Donタプルにどのような順序付けを課すかは明確ではないと思います。私はpythonが最初に最大の有効数字をチェックして、死に
Charlie Parker

20

Pythonドキュメントは、それを説明しません。

タプルとリストは、対応する要素の比較を使用して辞書式に比較されます。つまり、等しいことを比較するには、各要素が等しいことを比較し、2つのシーケンスが同じタイプで、長さが同じである必要があります。


この回答からリンクされたページには、引用されたテキストが含まれていないようです。
16:09にプラグウォッシュ

0

python 2.5のドキュメントは、それをよく説明しています。

タプルとリストは、対応する要素の比較を使用して辞書式に比較されます。つまり、等しいことを比較するには、各要素が等しいことを比較し、2つのシーケンスが同じタイプで、長さが同じである必要があります。

等しくない場合、シーケンスは最初の異なる要素と同じ順序で並べられます。たとえば、cmp([1,2、x]、[1,2、y])は、cmp(x、y)と同じ結果を返します。対応する要素が存在しない場合、短い方のシーケンスが最初に並べられます(たとえば、[1,2] <[1,2,3])。

残念ながら、そのページは、より新しいバージョンのドキュメントでは表示されなくなったようです。


0
整数比較に関して以前に混乱があったので、例を使ってより初心者にわかりやすいように説明します

a = ('A','B','C') # see it as the string "ABC" b = ('A','B','D')

Aはord('A') #65、他の要素と同じ対応するASCIIに変換されます

だから、 >> a>b # True あなたはそれを文字列間で比較することと考えることができます(正確には、実際にです)

整数についても同じことが言えます。

x = (1,2,2) # see it the string "123" y = (1,2,3) x > y # False

(1は1以下、2は2以下、次は2は3以下-辞書式順序-)

重要なポイントは上記の回答で述べられています

要素がアルファベット順ではない別の要素の前にあると考えてください。この場合、すべてのタプル要素を1つの文字列と見なします。


2
(1,2,3) > (1,2,2)与えるTrue
Vishal Singh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.