3

を使用するときに重複する値を含むエントリを除外するためのエレガントまたはpythonicな方法はありますzipか?

例として:

>>> list1 = [0, 1]
>>> list2 = [0, 2]
>>> zip(list1, list2)
[(0, 0), (1, 2)]

2 番目の要素だけが必要[(1, 2)]です。現在、私は

[x for x in zip(list1, list2) if len(set(x)) == len(x)]

しかし、これは少し退屈に感じます。これを行うより良い方法はありますか?


編集:そして、これを2つ以上のリストがある一般的なケースにどのようにスケーリングしますか?

>>> list1 = [0, 1]
>>> list2 = [0, 2]
>>> list3 = [0, 3]
>>> ...
>>> zip(list1, list2, list3, ...)

いずれかのエントリに重複する値が含まれている場合は、破棄する必要があります (タプル内のすべての値が等しい必要はありません)。

4

3 に答える 3

7

どうですか

[(x,y) for (x,y) in zip(list1, list2) if x != y]

一般的なケース:

[x for x in zip(list1, list2, ... listn) if not all(z == x[0] for z in x[1:])]

それは、すべての要素が等しい重複を見つけます。重複としてカウントするために 1 つのペアのみを等しくする必要がある場合は、ハッシュ可能な型があれば、質問で既に述べた set メソッドを使用できます。ハッシュ化できない型がある場合、重複を識別するという (興味深い) 質問は、以前にここで回答されています。

于 2013-04-26T15:04:35.497 に答える
2

値が 2 つのタプルしかないため、最初の値を 2 番目の値と比較できます。リスト内包表記が最適なオプションです。

[x for x in zip(list1, list2) if x[0] != x[1]]

一般的なケースでは、値がすべてハッシュ可能であれば、すでに最適なオプションがあります。

ハッシュ不可能な型がある場合は、すでに「一意の」処理を特殊なケースにする必要があるため、ここでは範囲外です。

于 2013-04-26T15:04:14.823 に答える
1

allIMHO を使用して、コードの意図をより明確に表現するさらに別の方法を次に示します。

[x for x in zip(list1, list2) if not all(x[0] == rest for rest in x)]

これには、任意のサイズのタプル (2 つの要素だけでなく、実行できますzip(list1, list2, list3)) に対して機能し、ジェネレーター式を使用するため、追加のリストやセットなどを作成しないという利点があります。

于 2013-04-26T15:14:24.117 に答える