gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:05:21 25 4
gpt4 key购买 nike

假设我有以下对象:

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

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

有什么建议吗?

更新:

感谢 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")

对这种方法有什么意见吗?

最佳答案

试试这个尺寸:

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")

请记住,传达想法要尽可能少,您可以在这里和那里进行许多调整和检查。

关于Python列表、查找对象名称、效率建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3325711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com