2016-10-24 7 views
0

私はタプルのセットを持っています。各タプルは3つのデータ値を持っています。私が取り組んでいる問題では、各タプルに4つのデータ値をエンコードする必要がありますが、4つ目の値はタプルの等価性を決定する際に考慮されるべきではありません。より正式に、Python - タプルに「隠された」値を追加する

tuple1 = ('a', 'b', 'c', 'd') 
tuple2 = ('a', 'b', 'c', 'f') 

tuple1 == tuple2 # Should be true 

tuple1をセットにした場合はさらに、tuple2はそれに追加することはできませんが、タプルの等価性がに影響されないよう、この「隠れた」値を実施するための最良の方法は何

を設定しましたそれ?

タプルを囲むクラスを作成し、equal()およびhash()関数をオーバーライドして、最後の要素がその側面では無関係であると考えました。しかし、私が取り組んでいる問題は計算集約的なので、この機能を実装するより速い方法があるのだろうかと思っていました。

ご存知の方は、ぜひご連絡ください。ありがとうございました。

+1

私が知っている限り、組み込みの機能はありません。 –

+0

あなたは自分のクラスを書く必要があると思います。私はまた、これができる他の方法があるかどうかを知りたいと思っています。 – shuttle87

+0

データ型に組み込まれているこの等価機能が必要です。そうでなければ、セットとハッシュテーブルでは使用できません。 – Naldhelaan

答えて

2

tupleをサブクラス化し、__new____init__の組み合わせを使用して、4番目の属性を別の属性として保持するタプルを作成します。私はあなたのソリューションがどのように "タプル的"である必要があるのか​​分かりませんが、これは簡単な解決策です。代わりにタプル(隠された値と各)のセットとして、あなたの問題の思考の

class MyTuple(tuple): 

    def __new__(cls, a, b, c, d): 
     return super(MyTuple, cls).__new__(cls, (a,b,c)) 

    def __init__(self, a, b, c, d): 
     self.d = d 

    @property 
    def as_tuple(self): 
     return self + (self.d,) 

    def __repr__(self): 
     return 'Mytuple' + repr(self.as_tuple) 

    def __str__(self): 
     return str(self.as_tuple) 


tuple1 = MyTuple('a', 'b', 'c', 'd') 
tuple2 = MyTuple('a', 'b', 'c', 'f') 

tuple3 = MyTuple('w', 'x', 'y', 'z') 

my_dict = {tuple1:'one', tuple2:'two', tuple3:'three'} 
print('hashed', my_dict) 
+0

わかりません。変更可能な型に不変型をサブクラス化することは、毛深いようです。 hmmm – wim

+0

通常、 '' __slots__ = ['d'] ''をクラスに入れておくと、それぞれのインスタンスでその辞書を作成することは避けられますが、残念ながらそれは 'タプルを扱う(可変サイズの性質のため)。 – jasonharper

+0

@wim - 不変型を継承するのは一般的ではありませんが、確かにその使用法があり、私はその部分を悩ますことはありません。オブジェクトをインスタンス化するために余分なスペースと余分な時間が必要になる可能性がありますが、現代的なハードウェアでは、私が心配する前に重要なデータセットにする必要があります。 Pythonがあなたのコアを焼き、あなたのRAMを食べることができる多くの方法があります! – tdelaney

0

は、あなたが隠された値に与えられたタプルをマッピングする辞書としてのようなものと考えることができませんでしたか?

関連する問題