5

だから私は、タプルの比較が辞書的に機能することを知っています:

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

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

だからこれから:

>>> a = (100, 0)
>>> b = (50, 50)
>>> a > b
True

しかし、2つのタプルのすべての要素を順番に比較したいので、機能的には(上記の値を使用して)に似たものが必要です:

>>> a > b
(True, False) #returned tuple containing each comparison
>>> all(a > b)
False

実際の例として、画面座標のようなものについて、何かが画面の「内側」(0,0) にあるかどうかを確認したいが、座標 > (0,0) のような比較を行った場合、x 座標が0 より大きいが、y 座標が小さい場合でも true が返されるため、この場合は必要ありません。

サブ質問/ディスカッションの一種として:
異なる値の2つのタプルを比較すると、そのような方法で返される理由がわかりません。いかなる種類のインデックスも与えられていないため、タプルを比較して得られる唯一のこと (同等性をテストしていない) は、タプルのある時点で、比較の 1 つが true または false の値をスローすることです。等しくない。それをどのように活用できますか?

4

5 に答える 5

10

これは、リスト内包表記と zip ビルトインを使用して実現できます。

>>> a = (100, 0)
>>> b = (50, 50)
>>> [(a > b) for a, b in zip(a,b)]
[True, False]

返されたリストで all() または any() を使用できます。

于 2012-04-28T00:25:32.903 に答える
1

2 番目のコード サンプルで にa > b置き換えます。tuple(i > j for i, j in zip(a,b))

>>> a = (100, 0)
>>> b = (50, 50)
>>> tuple(i > j for i, j in zip(a,b))
(True, False)
>>> all(i > j for i, j in zip(a,b))
False
于 2012-04-28T00:28:55.267 に答える
0

説明されている動作を取得するには、次を試してください。

[ai > bi for ai,bi in zip(a,b)]

タプルの比較がそのように返される理由は、次のように書きたい場合があるためです。

if a >= (0.,0.):
    print "a has only positive values"
else:
    print "a has at least one negative value"

Python が記述したタプルを返す場合、他のことは決して起こりません。試す

if (False,False):
    print "True!" # This is what is printed.
else:
    print "False!"

これが役立つことを願っています。

于 2012-04-28T00:35:05.683 に答える