python中最快的方法是从列表中查找具有某些属性值的对象?

时间:2012-10-03 18:48:54

标签: python list class uniqueidentifier loops

从对象列表中找到对象具有特定值的最快和/或最简单(速度偏好)方式。我得到了一个类列表,我正在循环,并且我还有一个对象列表,我需要查看该对象是否是当前正在循环的类的实例。这就是我到目前为止所使用的内容,但是出于速度目的,这对于屁股来说是一种痛苦。

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,它也被赋予该类的每个实例,以识别实例的类型

3 个答案:

答案 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)