39

オブジェクトのリストと、レコードでいっぱいの db テーブルがあります。オブジェクトのリストに title 属性があり、タイトルが重複しているオブジェクトをリストから削除したい (オリジナルは残します)。

次に、オブジェクトのリストにデータベース内のレコードの重複があるかどうかを確認し、重複している場合は、それらのアイテムをデータベースに追加する前にリストから削除します。

次のようなリストから重複を削除するための解決策を見てきましmyList = list(set(myList))たが、オブジェクトのリストでそれを行う方法がわかりませんか?

オブジェクトのリストの順序も維持する必要があります。difflibまた、タイトルの違いを確認するために使用できるのではないかと考えていました。

4

8 に答える 8

62

set(list_of_objects)、重複が何であるかを知っている場合にのみ重複を削除します。つまり、オブジェクトの一意性を定義する必要があります。

そのためには、オブジェクトをハッシュ可能にする必要があります。__hash____eq__メソッドの両方を定義する必要があります。方法は次のとおりです。

http://docs.python.org/glossary.html#term-hashable

__eq__ただし、おそらくメソッドを定義するだけで済みます。

編集:メソッドを実装する__eq__方法:

前述したように、オブジェクトの一意性の定義を知る必要があります。組み合わせが一意である属性author_nameとtitleを持つ本があると仮定します(したがって、スティーブンキングが作成した多くの本と、シャイニングという名前の本がたくさんありますが、スティーブンキングによるシャイニングという名前の本は1冊だけです)。以下のとおりであります:

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

同様に、これは私が時々メソッドを実装する__hash__方法です:

def __hash__(self):
    return hash(('title', self.title,
                 'author_name', self.author_name))

同じ著者とタイトルの2冊の本のリストを作成すると、本のオブジェクトが同じ(is演算子を使用)および等しい(演算子を使用)になることを確認できます==。また、set()を使用すると、1冊の本が削除されます。

編集:これは私の古い答えの1つですが、最後の段落の取り消し線で修正されたエラーがあることに気づきました。同じオブジェクトは、と比較すると表示されhash()ません。ただし、オブジェクトのハッシュ可能性は、セットの要素として、または辞書のキーとして使用する場合に使用されます。Trueis

于 2010-11-13T15:41:37.547 に答える
22

これらはハッシュ可能ではないため、セットを直接使用することはできません。タイトルはそうあるべきです。

これが最初の部分です。

seen_titles = set()
new_list = []
for obj in myList:
    if obj.title not in seen_titles:
        new_list.append(obj)
        seen_titles.add(obj.title)

ただし、2番目の部分で使用しているデータベース/ORMなどを説明する必要があります。

于 2010-11-12T21:43:30.413 に答える
2

これはかなり最小限のようです:

new_dict = dict()
for obj in myList:
    if obj.title not in new_dict:
        new_dict[obj.title] = obj
于 2010-11-13T02:32:15.650 に答える
-3

元の順序を維持したい場合は、次のように使用します。

seen = {}
new_list = [seen.setdefault(x, x) for x in my_list if x not in seen]

順序付けを気にしない場合は、次のように使用します。

new_list = list(set(my_list))
于 2016-11-20T06:55:41.857 に答える
-11

その非常に簡単な友達:-

a = [5,6,7,32,32,32,32,32,32,32,32]

a = list(set(a))

印刷(a)

[5,6,7,32]

それでおしまい !:)

于 2011-03-17T12:09:58.163 に答える