即時通訊目前通過與名稱值作爲字典鍵這樣創建對象的字典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的方式來做到這一點。
即時通訊目前通過與名稱值作爲字典鍵這樣創建對象的字典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的方式來做到這一點。
如果兩個具有相同名稱的對象應始終視爲相同,則可相應地執行__eq__
和__hash__
。然後爲所有對象存儲在set()
您的解決方案將是一樣容易:
new_obj_list = list(set(obj_list))
轉換列表回一組甚至可能是不必要的,因爲訂單總會丟失所以,除非你需要用它做什麼只適用於列表,但不適用於集合,只是繼續使用集合。
完全是我的想法,但在iPad上輸入答案很慢:) – orlp 2012-08-11 12:59:47
如果你需要訂購:
oset = set()
new_obj_list = []
for o in obj_list:
if o not in oset:
oset.add(o)
new_obj_list.append(o)
我還要去設定的做法,但後來想通要能夠查找的名字我猜...,但這裏是沒有按另一種方法不需要修改課程...(雖然有點貴)...請注意,您可以將其他排序參數添加到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中還有一個獨特的最後看到的食譜。
否則,對於不同的排序要求,把它們作爲不同類的方法,(或者一個叫「排序」,需要一個已知順序和調用的內部函數)...
這是一個很好的方式。 – Marcin 2012-08-11 13:06:22