2

从对象列表中找到在特定属性上具有特定值的对象的最快和/或最简单(速度首选)的方法是什么。我得到了一个正在循环的类列表,我还得到了一个对象列表,我需要查看该对象是否是当前正在循环的类的实例。到目前为止,这是我一直在使用的东西,但出于速度目的,这让我很头疼。

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

4

3 回答 3

3

如果你__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
于 2012-10-03T18:56:49.320 回答
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 存储在集合中,查找它们可以比重新扫描列表快得多。

于 2012-10-03T19:11:47.563 回答
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)
于 2013-11-24T12:09:53.077 回答