1

現在、次のように名前の値を辞書キーとしてオブジェクトの辞書を作成することにより、名前属性に基づいてオブジェクトのリストを一意化しています。

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な方法があるかどうか疑問に思っていました.

4

3 に答える 3

12

同じ名前の 2 つのオブジェクトが常に同一であると見なされる場合は、それに応じて実装でき__eq__ます__hash__。次に、ソリューションは、すべてのオブジェクトを に格納するのと同じくらい簡単ですset()

new_obj_list = list(set(obj_list))

いずれにしても順序が失われるため、リストをセットに戻す必要はおそらくないので、リストでのみ機能し、セットでは機能しない何かを行う必要がない限り、セットを使い続けるだけです。

于 2012-08-11T12:58:43.563 に答える
1

注文が必要な場合:

oset = set()
new_obj_list = []
for o in obj_list:
    if o not in oset:
        oset.add(o)
        new_obj_list.append(o)
于 2012-08-11T13:16:16.460 に答える
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 にもユニークな最後に見たレシピがあります。

それ以外の場合、順序要件が異なる場合は、それらを異なるクラス メソッド (または既知の順序を取り、内部関数を呼び出す「並べ替え」と呼ばれるもの) として配置します...

于 2012-08-11T13:22:05.287 に答える