0

私は持っています

class rel:
   child=''
   parent=''
listPar=[]

そして、listParにはこれらのクラスのリストがあります(用語については申し訳ありませんが、クラスと呼ばれるかどうかはわかりません)。したがって、listParには次のようなものがあります。本のタイトル; 部屋の本;本のタイトル

そして今、私はすべての非一意の発生を削除しようとしているので、私は

部屋の本; listParの本のタイトル

私が次のコードを持っていると仮定しましょう:

variable="Book"
variable2="Author"
toIns=rel()
toIns.parent=variable 
toIns.child=variable2 
listPar.append(toIns) 

toIns2=rel()
toIns2.parent=variable
toIns2.child=variable2 
listPar.append(toIns2) 

そして今、すべての重複を削除する方法は?(結果->

for elem in listPar:
    print "child:",elem.child,"parent:",elem.parent

#child:author, parent:book

私はいくつかのことを試しましたが、どれも完全には機能していないようです。助けていただけませんか。

4

1 に答える 1

5

あなたが与えたクラスは実際のクラスではないと思いますが(価値がないので)、ここで行うのが最も簡単なことです-要素の順序はあなたにとって重要ではないと仮定します、リストをセットにして、すべての重複を削除します。

>>> a = ["test", "test", "something", "else"]
>>> a
['test', 'test', 'something', 'else']
>>> set(a)
{'test', 'something', 'else'}

ここでは文字列を使用していますが、等式演算子とハッシュ関数を提供する任意のクラスを使用できます。等式関数は、2つのクラスが同じであるかどうかをチェックするために使用され(カスタムクラスの場合は、それを定義する必要があります)、ハッシュを使用してセットを非常に効率的にします。同じハッシュを与える2つのクラスは同じでなければなりません。同じではない同じハッシュを持つ2つのクラスを持つことができます(等式演算子にフォールバックします)が、これが発生するほど遅くなります。一般に、同等性をチェックするために使用するクラスのコンポーネントのハッシュの合計を使用することは、適切なハッシュを生成するための良い方法です。

したがって、たとえば:

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

    def __eq__(self, other):
        return self.title == other.title and self.author == other.author

    def __hash__(self):
        return hash(self.title)+hash(self.author)

    def __repr__(self):
        return "Book("+repr(self.title)+", "+repr(self.author)+")"

このクラスは以前と同じように使用できます。

>>> a = [Book("Some Book", "Some Guy"), Book("Some Book", "Some Guy"), Book("Some Other Book", "Some Other Guy")]
>>> a
[Book('Some Book', 'Some Guy'), Book('Some Book', 'Some Guy'), Book('Some Other Book', 'Some Other Guy')]
>>> set(a)
{Book('Some Other Book', 'Some Other Guy'), Book('Some Book', 'Some Guy')}

重複を削除した後でも、要素の順序を気にする場合は、次のようにすることができます。

def remove_duplicates_preserving_order(seq):
    seen = set()
    return [ x for x in seq if x not in seen and not seen.add(x)]

これは、辞書の理解を少しハックすることで機能します-set.add()常に0を返すので、要素をセットに追加するためにfalse(常にそうなる)であることを確認できます。

更新のために編集:

PEP-8CapWordsは、クラスおよびlowercase_with_underscoresローカル変数に使用することをお勧めします。

Pythonクラスがどのように機能するかについて誤解しているようです。これらはすべてクラス属性であり、インスタンス属性ではないため、このクラスはあまり意味がありません。これは、それらがクラスのすべてのインスタンスで同じになることを意味し、それはあなたが望むものではありません。つまり、2回目に変更すると、すべてのインスタンスで変更され、すべて同じになります。

インスタンス変数(必要なタイプ)を作成するには、コンストラクター内でインスタンス変数を作成します(__init__())-サンプルクラスをチェックして、これがどのように機能するかを確認します。これを行ったら 、Pythonがクラスの2つの項目が等しいことの意味を認識できるように__eq__()、関数を実装する必要があります。__hash__()次に、上記で説明した方法(セットまたは指定した関数)を使用して、重複を削除できます。

これがデータでやりたいことのすべてである場合、クラスはやり過ぎかもしれないことに注意してください。常に2つのアイテムがある場合は、タプルを使用できます。

>>> a = [("Book", "Author"), ("Book", "Author"), ("OtherBook", "OtherAuthor")] 
>>> set(a)
{('Book', 'Author'), ('OtherBook', 'OtherAuthor')}

タプルはすでにあなたの平等をそれらの部分の合計として定義しているので。

全体として、Pythonでクラスがどのように構築され、使用されるかについての理解が不足しているようです。そうしないと多くの問題が発生するため、何よりも先にクラスを読んで使用する方法を学ぶことをお勧めします。

于 2012-04-25T09:46:18.523 に答える