가정하자 나는 다음 개체가 :파이썬 목록 조회 오브젝트 이름, 효율성 조언
class Foo(object):
def __init__(self, name=None):
self.name = name
def __repr__(self):
return self.name
과 같은 여러 인스턴스를 포함하는 목록을 : 나는 객체를 찾으려면
list = [Foo(name='alice'), Foo(name='bob'), Foo(name='charlie')]
주어진 이름으로 다음을 사용할 수 있습니다 :
def get_by_name(name, list):
return [foo for foo in list if foo.name == name][-1]
분명히 :
print get_by_name('alice', list)
>> alice
그러나 더 효율적인 데이터 구조 또는 이러한 개체를 검색하는 방법이 있습니까? 실제로 개체 이름은 런타임에만 알려 지므로 이론적으로 개체의 수명주기 전체에서 변경 될 수 있습니다.
어떤 조언이 필요합니까?
UPDATE :이 방법에
class Foo(object):
_all_names = {}
def __init__(self, name=None):
self._name = None
self.name = name
@property
def name(self):
return self._name
@name.setter
def name(self, name):
if self._name is not None:
self._all_names[self._name].remove(self)
self._name = name
if name is not None:
self._all_names.setdefault(name, []).append(self)
@classmethod
def get_by_name(cls, name):
return cls._all_names[name]
def __repr__(self):
return "{0}".format(self.name)
l = [Foo("alice"), Foo("bob"), Foo('alice'), Foo('charlie')]
print Foo.get_by_name("alice")
print Foo.get_by_name("charlie")
모든 의견을 : 매트 참가자의 대답
덕분에, 나는 그것이 같은 이름을 가진 여러 푸의를 지원하도록 업데이트했다?
주어진 이름의 개체 또는 * Foo *? –
질문이 업데이트되었습니다. – epoch
당신이 지금 생각하는 것을보십시오. –