2013-06-27 9 views
11

私はそれぞれが特定の属性を持つオブジェクトのリストを持っています。その属性は一意ではなく、すべての特定の属性が一意のセットであるように、リスト全体のサブセットであるオブジェクトのリストにしたいと思います。例えば一意の属性を持つオブジェクトのリスト

、私は4つのオブジェクトがある場合:

object1.thing = 1 
object2.thing = 2 
object3.thing = 3 
object4.thing = 2 

私はで終わるしたいのいずれか

[object1, object2, object3] 

または

[object1, object3, object4] 

に巻く正確なオブジェクト最終的なリストは重要ではなく、特定の属性のリストが一意であることだけが重要です。

EDIT:明確にするために、本質的に私が望むのは、その特定の属性からキーで設定されたセットです。

+1

の可能性のある重複[キーワードを使用して独自のリストを取得する方法:Pythonの](https://stackoverflow.com/questions/10024646/how-to-get-unique-list-using-a-key-word-python) – Georgy

答えて

12

キーはオブジェクトのもので、値はオブジェクトそのものです。

d = {} 
for obj in object_list: 
    d[obj.thing] = obj 
desired_list = d.values() 
+7

短い: 'dict((obj.thing、obj)for obj inオブジェクトリスト).values() ' –

+0

私はそれを間違いなく好きですが、私はいつもdictの内包を読むのに苦労しています。私は自分がしていたことを明確にしたかったのです。 – Brien

+2

Python 3では、 '{obj.thing:object_listのobjのためのobj}'(ただし、 'values'のリストではなく、ビューを返します)という方が気に入っています。 –

14

あなたが使用することができますlist comprehensionset

objects = (object1,object2,object3,object4) 
seen = set() 
unique = [obj for obj in objects if obj.thing not in seen and not seen.add(obj.thing)] 

上記のコードは同等です:

seen = set() 
unique = [] 
for obj in objects: 
    if obj.thing not in seen: 
     unique.append(obj) 
     seen.add(obj.thing) 
+0

セットはdictsよりもタスクをよりよく伝えるので、上書きされます。どちらもPythonの "ハッシュ可能"オブジェクトの概念を使用しているため、機能的に同等です。しかし、私があなたのコードを読んでいるならば、セットはすぐに私に "彼は物事の独自のリストを望んでいる"と言いますが、dictは "彼はデータをマップする必要があります"と言いますが、この場合誤解を招きます。 – Dave

+5

これはより良い解決策ですが、Python 2と3の両方でコードの構文エラーが発生します。 unique = [obj.thingが見えず、not.ad(obj.thing)ではない場合のオブジェクトのobj は正しい構文です – GDR

関連する問題