2010-10-05 68 views
2

Python中的每個列表或集合用法的例子似乎都包含一些普通的整數情況,但我有兩個對象列表,其中name屬性定義兩個對象實例是「相同」還是不(其他屬性可能有不同的值)。基於屬性組合兩個對象列表

我可以創建一個包含兩個列表,排序的所有項目的列表,以

tmpList = sorted(list1 + list2, key=attrgetter('name')) 

,但我怎麼做相同的,因此必須在name屬性相同的值列表項選自第二個列表?

例如結合這兩個列表

list1 = [obj('Harry',18), obj('Mary',27), obj('Tim', 7)] 
list2 = [obj('Harry', 22), obj('Mary', 27), obj('Frank', 40)] 

將導致

list = [obj('Harry',22), obj('Mary', 27), obj('Tim', 7), obj('Frank', 40)] 

(I使用OBJ()作爲縮寫符號用於具有兩個屬性的對象。)

看來我不能在大多數set和list函數中使用attrgetter()函數,就像我可以使用sorted()函數一樣,所以我無法弄清楚我應該如何執行此操作。我懷疑我可以使用lambda函數,但是我對函數式編程不太熟悉,所以我似乎無法解決這個問題。

天真的解決方案(首先挑選在兩個列表中唯一的所有項目,然後將該列表與第二個列表中的剩餘項目結合起來)看起來非常冗長,因此Python中必須有一個更簡單的方法。

+0

爲什麼不使用字典? – JoshD 2010-10-05 07:12:06

回答

4

對我來說聽起來像你可能會更好用一個dict而不是一個列表,使用名稱作爲鍵,對象的其餘部分作爲值。那麼你可以簡單地dict1.update(dict2)

>>> dict1 = {"Harry": 18, "Mary": 27, "Tim": 7} 
>>> dict2 = {"Harry": 22, "Mary": 27, "Frank": 40} 
>>> dict1.update(dict2) 
>>> dict1 
{'Tim': 7, 'Harry': 22, 'Frank': 40, 'Mary': 27} 
+0

好的,謝謝,現在有用!我一直在努力讓這個工作整個上午,所以這是很大的幫助! – Makis 2010-10-05 07:54:27

1

是的。簡單的方法是一本字典。

list1 = {"Harry": 18, "Mary": 27, "Tim": 7} 
list2 = {"Harry": 22, "Mary": 27, "Frank": 40} 

list1.update(list2) 

名單現在{'Harry':22, 'Mary': 27, 'Tim': 7, 'Frank': 40}

如果你的數據比只多不少,沒關係。您可以將任何類型的對象作爲字典的值。

list1['Harry'] = (1,"weee",54.55) 
+0

我接受了蒂姆的回答,因爲第一段很容易理解,但也要感謝你的回答。 – Makis 2010-10-05 07:53:52

0

您可以在對象中實現de __eq__屬性。基於此,您可以將您的對象與==運算符進行比較。

相關問題