dict
(キーは一意なので)使用してみませんか?
私たちが持っていると仮定して
class Object:
def __init__(self, id):
self.id = id
Aobject = Object(1)
Bobject = Object(1)
Cobject = Object(2)
objects = [Aobject, Bobject, Cobject]
次にlist
、Python 3の理解を使用してObject
、フィールドごとに一意のsid
を生成できます。dict
unique_objects = list({object_.id: object_ for object_ in objects}.values())
Python2.7で
unique_objects = {object_.id: object_ for object_ in objects}.values()
Pythonでは< 2.7
unique_objects = dict([(object_.id, object_) for object_ in objects]).values()
最後に、関数を書くことができます(Python 3バージョン)
def unique(elements, key):
return list({key(element): element for element in elements}.values())
ここで、elements
はanyiterable
であり、key
オブジェクトをcallable
返すものです(特定の場合はに等しい)。hashable
elements
key
operator.attrgetter('id')
Marcinの答えseen
はうまく機能しますが、リスト内包表記はオブジェクトを外部スコープから変更するため、Pythonicには見えません。また、メソッドを使用してその結果( )set.add
をと比較することには魔法があります。None
obj
そして最後の、しかしそれほど重要ではない部分:
基準
setup = '''
import random
class Object:
def __init__(self, id):
self.id = id
objects = [Object(random.randint(-100, 100))
for i in range(1000)]
'''
solution = '''
seen = set()
result = [seen.add(object_.id) or object_
for object_ in objects
if object_.id not in seen]
'''
print('list comprehension + set: ',
min(timeit.Timer(solution, setup).repeat(7, 1000)))
solution = '''
result = list({object_.id: object_
for object_ in objects}.values())
'''
print('dict comprehension: ',
min(timeit.Timer(solution, setup).repeat(7, 1000)))
私のマシンで与える
list comprehension + set: 0.20700953400228173
dict comprehension: 0.1477799109998159