![](/img/trans.png)
[英]How to group two lists of class objects based on an Attribute efficiently in Python?
[英]Combining two lists of objects based on an attribute
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)]
(我將obj()用作具有兩個屬性的對象的簡寫形式。)
似乎我無法在大多數set和list函數中使用attrgetter()函數,就像在sorted()函數中一樣,因此我不知道該怎么做。 我懷疑我可以使用lambda函數,但我對函數式編程不太熟悉,因此似乎無法弄清楚。
天真的解決方案(首先選擇兩個列表中唯一的所有項目,然后將該列表與第二個列表的剩余內容組合在一起)似乎花費了很多時間,因此在Python中必須有一種更簡單的方法。
在我看來,您最好使用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}
是。 簡單的方法是字典。
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)
您可以在對象中實現de __eq__
屬性。 基於此,您可以將對象與==運算符進行比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.