2013-06-27 56 views
11

我有一個對象列表,每個對象都有一個特定屬性。該屬性不是唯一的,我想最終列出作爲整個列表子集的對象,以便所有特定屬性都是唯一集合。具有唯一屬性的對象列表

舉例來說,如果我有四個目標:

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

我想直到結束或者

[object1, object2, object3] 

[object1, object3, object4] 

,在風的確切對象最後的列表並不重要,只是其特定屬性的列表是唯一的。

編輯:爲了澄清,基本上我想要的是一套是關閉該特定屬性。

+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

Shorter:'dict((obj.thing,obj)for obj in object_list中).values()'。 –

+0

我絕對喜歡,但我總是很難閱讀字典的理解,我想清楚我在做什麼。 – Brien

+2

Python 3使它更漂亮:'{obj.thing:obj for object_list}'(但返回一個視圖,而不是來自'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

Upvoted因爲集比章節更好地傳達任務。兩者都使用Python的「可哈希」對象的概念,因此在功能上是等同的。但是如果我正在閱讀你的代碼,集會告訴我「他想要一個獨特的事物列表」,而字典告訴我「他需要映射數據」,在這種情況下,這是誤導性的。 – Dave

+5

這是一個更好的解決方案,但代碼導致Python 2和3都出現語法錯誤。 unique = [obj for obj.thing not in seen and not seen.add(obj.thing)] 是正確的語法 – GDR

相關問題