5

タプルのリストがあり、各タプルが変数、、、を表す場合、a冗長bcタプルを削除するにはどうすればよいですか?

冗長タプルとは、abが単純に交換されるタプルですcが、同じです。したがって、この例では:

tups = [(30, 40, 50), (40, 30, 50), (20, 48, 52), (48, 20, 52)]

私の最終的なリストには、エントリの半分だけが含まれている必要があります。1つの可能な出力:

tups = [(30, 40, 50), (20, 48, 52)]

tups = [(40, 30, 50), (20, 48, 52)]

これを行う簡単なPythonの方法はありますか?

セットを使ってみましたが、(30, 40, 50)とは異なり(40, 30, 50)ますが、私にとっては冗長であり、そのうちの1つを保持したいと思います(どちらでも構いませんが、選択できる場合は、値の低いものから高いものの順序を選択します) 。タプルの最初の2つの要素をソートする方法があれば、セットを使用すると機能します。

実用的なソリューション(おそらく中間ステップとしてタプルをリストに変換する)を一緒にハックできると確信していますが、これを行うための簡単で明白な方法が私にはなじみがないかどうかを確認したかっただけです。

PS:この質問はPE#39によって部分的に動機付けられています。しかし、このPEの問題は別として、私は今、これをどのように簡単に(またはもし)行うことができるのか興味があります。

編集

PE#39に慣れていない人のために少しコンテキストを提供するために-、、、a直角三角形の辺bc表すので、、a**2 + b**2 == c**2明らかに順序が重要であるかどうかを確認しています。ab

4

5 に答える 5

7
set([(a,b,c) if a<b else (b,a,c) for a,b,c in tups])
于 2012-07-28T23:32:44.543 に答える
4
tups = [(30, 40, 50), (40, 30, 50), (20, 48, 52), (48, 20, 52)] 
no_duplicates = list(set(tuple(sorted(tup)) for tup in tups))

もちろん、これは、各タプルの3番目の要素が常に各タプルの最大要素であると想定しています。それ以外の場合は、次のようにします。

no_duplicates = list(set(tuple(sorted(tup[:2])) + (tup[2],) for tup in tups))

WolframHが示唆したように、式tuple(sorted(tup[:2])) + (tup[2],)はとして書くことができますtuple(sorted(tup[:2])) + tup[2:]。これは、に一般化できるので有利ですtuple(sorted(tup[:i])) + tup[i:]。ここでi、ソートされた要素をソートされていない要素から分離したい任意のポイントにすることができます。

于 2012-07-28T23:27:38.920 に答える
4

あなたの質問から、タプルの最初の2つの要素がタプル内のサブユニットを形成しているようです。したがって、データをタプルと3番目の数値のタプルとして再構築することは理にかなっているように思われます。ここで、最初のタプルはソートされた順序で最初の2つの数値です。次に、セットを自然に使用できます。

>>> newTups = [(tuple(sorted([a, b])), c) for a, b, c in tups]
>>> newTups
[((30, 40), 50), ((30, 40), 50), ((20, 48), 52), ((20, 48), 52)]
>>> set(newTups)
set([((20, 48), 52), ((30, 40), 50)])
于 2012-07-28T23:29:13.167 に答える
2

各タプルをに変換し、これらのフリーズセットfrozensetを作成します。set

tups = [(30, 40, 50), (40, 30, 50), (20, 48, 52), (48, 20, 52)]

frozen_sets = { frozenset(x) for x in tups }

tups2 = [tuple(x) for x in frozen_sets]

これが機能するfrozenset([1,2,3]) == frozenset([3,1,2])のは、タプルとは対照的に、ここで(1,2,3) != (3,1,2)

あるセットを別のセットのメンバーにしようとすると次のエラーが発生するため、タプルをfrozenset単純なsではなくsに変換する必要があります。set

TypeError: unhashable type: 'set'

frozensetはハッシュ可能であるため、この問題を回避してください。

于 2012-07-28T23:46:25.707 に答える
1

最初の2つの要素の順序を気にしない場合は、3つのタプルを使用する必要はありません。不要な情報を破棄する新しいデータ構造に変換するだけです。

result = {({x[0],x[1]},x[2]) for x in tups}
于 2012-07-28T23:27:42.040 に答える