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)
对这种方法有何评论?
试试这个尺码:
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)
请记住,它保持最小化以传达这个想法,你可以在这里和那里做很多调整和检查.