2012-08-11 71 views
1

即時通訊目前通過與名稱值作爲字典鍵這樣創建對象的字典uniquifying根據自己的name屬性的對象的列表:最快的方式

obj_dict = dict() 

for obj in obj_list: 
    if not obj.name in obj_dict: 
     obj_dict[obj.name] = obj 

new_obj_list = obj_dict.items() 

我想知道是否有更快或更pythonic的方式來做到這一點。

+1

這是一個很好的方式。 – Marcin 2012-08-11 13:06:22

回答

12

如果兩個具有相同名稱的對象應始終視爲相同,則可相應地執行__eq____hash__。然後爲所有對象存儲在set()您的解決方案將是一樣容易:

new_obj_list = list(set(obj_list)) 

轉換列表回一組甚至可能是不必要的,因爲訂單總會丟失所以,除非你需要用它做什麼只適用於列表,但不適用於集合,只是繼續使用集合。

+0

完全是我的想法,但在iPad上輸入答案很慢:) – orlp 2012-08-11 12:59:47

1

如果你需要訂購:

oset = set() 
new_obj_list = [] 
for o in obj_list: 
    if o not in oset: 
     oset.add(o) 
     new_obj_list.append(o) 
0

我還要去設定的做法,但後來想通要能夠查找的名字我猜...,但這裏是沒有按另一種方法不需要修改課程...(雖然有點貴)...請注意,您可以將其他排序參數添加到sorted以便按其他優先級排序(如年齡,性別等)。

from operator import attrgetter 
from itetools import groupby 
unique_by_name = {key: next(item) for key, item in groupby(attrgetter('name'), sorted(obj_list, key=attrgetter('name')))} 

itertools中還有一個獨特的最後看到的食譜。

否則,對於不同的排序要求,把它們作爲不同類的方法,(或者一個叫「排序」,需要一個已知順序和調用的內部函數)...