从对象列表中找到对象具有特定值的最快和/或最简单(速度偏好)方式。我得到了一个类列表,我正在循环,并且我还有一个对象列表,我需要查看该对象是否是当前正在循环的类的实例。这就是我到目前为止所使用的内容,但是出于速度目的,这对于屁股来说是一种痛苦。
for cSoldier in soldierlist:
exists = False
for soldier in user.soldiers:
if cSoldier.id == soldier.id:
exists = True
break
if not exists:
user.soldiers.append(cSoldier())
soldierlist
适用于所有不同的士兵类,例如狙击手,骑士等等。
user.soldiers
用于为每个游戏用户存储每种士兵类型的一个实例
id
每个士兵类都有它唯一的classid,它也被赋予该类的每个实例,以识别实例的类型
答案 0 :(得分:2)
如果您在士兵类中定义__hash__
以返回士兵id
并定义__eq__
以测试id
平等,那么您可以尝试这样的事情:
user.soldiers = list(set(user.soldiers + soldierlist))
所以,在士兵课的某个地方:
def __hash__(self):
return self.id
def __eq__(self, other):
return self.id == other.id
答案 1 :(得分:0)
这是一种避免不断重新扫描列表的方法
current_ids = set(soldier.id for soldier in user.soldiers)
for soldier_class in soldierlist:
if soldier_class.id not in current_ids:
user.soldiers.append( soldier_class() )
通过将所有ID存储在集合中,查找它们可以更快地完成,然后只需重新扫描列表。
答案 2 :(得分:0)
我知道为时已晚,现在可能没用,但我遇到了同样的问题。所以,为了记录。 我的修复是制作一个对象列表和一个对象索引:
class Soldier:
soldiers = []
soldier_list = []
s_data = {"name":"jim", "id":"foo","type":"bar"}
name = soldier.get("name")
if name not in soldier_list:
soldiers.append(Soldier(**s_data)) #creates a object with s_data attribs
soldier_list.append(name)