Python列表,查找对象名称,效率建议

epo*_*och 3 python algorithm performance list-comprehension list

假设我有以下对象:

class Foo(object):
  def __init__(self, name=None):
    self.name = name

  def __repr__(self):
    return self.name
Run Code Online (Sandbox Code Playgroud)

以及包含多个实例的列表,例如:

list = [Foo(name='alice'), Foo(name='bob'), Foo(name='charlie')]
Run Code Online (Sandbox Code Playgroud)

如果我想找到一个具有给定名称的对象,我可以使用以下内容:

def get_by_name(name, list):
  return [foo for foo in list if foo.name == name][-1]
Run Code Online (Sandbox Code Playgroud)

这显然意味着:

print get_by_name('alice', list)
>> alice
Run Code Online (Sandbox Code Playgroud)

但是,是否有更有效的数据结构或方法来检索此类对象?实际上,对象名称仅在运行时已知,并且理论上可以在对象的整个生命周期中发生变化.

有什么建议?

更新:

感谢Matt Joiners的回答,我更新了它以支持多个具有相同名称的Foo:

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")
Run Code Online (Sandbox Code Playgroud)

对这种方法有何评论?

Mat*_*ner 8

试试这个尺码:

class Foo(object):
    _all_names = {}
    def __init__(self, name=None):
        self.name = name
    @property
    def name(self):
        return self._name
    @name.setter
    def name(self, name):
        self._name = name
        self._all_names[name] = self
    @classmethod
    def get_by_name(cls, name):
        return cls._all_names[name]
    def __str__(self):
        return "Foo({0})".format(self.name)

a = Foo("alice")
b = Foo("bob")
print Foo.get_by_name("alice")
Run Code Online (Sandbox Code Playgroud)

请记住,它保持最小化以传达这个想法,你可以在这里和那里做很多调整和检查.