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

python中从列表中查找具有特定属性值的对象的最快方法?,python,list,class,uniqueidentifier,loops,Python,List,Class,Uniqueidentifier,Loops,从对象列表中查找在特定属性上具有特定值的对象的最快和/或最简单(速度优先)方法是什么。我得到了一个类列表,我正在循环,我也得到了一个对象列表,我需要看看这个对象是否是当前正在循环的类的实例。这是我到目前为止一直在使用的,但为了提高速度,这是一个让人头疼的问题 for cSoldier in soldierlist: exists = False for soldier in user.soldiers: if cSoldier.id == soldier.id:

从对象列表中查找在特定属性上具有特定值的对象的最快和/或最简单(速度优先)方法是什么。我得到了一个类列表,我正在循环,我也得到了一个对象列表,我需要看看这个对象是否是当前正在循环的类的实例。这是我到目前为止一直在使用的,但为了提高速度,这是一个让人头疼的问题

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
适用于所有不同的士兵职业,例如狙击手、骑士等

用户。士兵
用于为该游戏的每个用户存储每个士兵类型的一个实例


id
如果在士兵类中定义
\uuuuuuhash\uuuu
以返回士兵
id
并定义
\ueq\uuuuu
以测试
id
相等性,则每个士兵类都有其唯一的classid,并且也被赋予该类的每个实例,以识别该实例的类型,您可以尝试以下方法:

user.soldiers = list(set(user.soldiers + soldierlist))

所以,在你的士兵课上:

def __hash__(self):
    return self.id

def __eq__(self, other):
    return self.id == other.id

这是一种避免不断重新扫描列表的方法

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存储在集合中,查找它们的速度比重新扫描列表快得多。

我知道这已经太晚了,现在可能没用了,但我也遇到了同样的问题。所以,记录在案。 我的解决方案是制作对象列表和对象索引:

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)

使用字典并将ID映射到各自的士兵。一旦你构建了字典,它是
O(1)
查找时间,而不是
O(N)
。这不会创建同一类的多个实例吗?如果
user.dampers
在狙击手实例中有效,但没有骑士实例,那么不会向用户的士兵添加新的狙击手实例吗?这实际上会将
soldierlist
中的所有内容添加到
user.dampers
中,并删除任何重复项(即,如果两名id相同的士兵出现在结果列表中,其中一人将被删除)。在OP的帖子中,他没有向列表中添加
cSolider
,而是添加
cSolider()
,也就是说,你的方法不太一样。哦,我没有看到结尾的括号…@Mahi,这不是打字错误,是吗?cSoldier是一个类。
soldierlist
适用于所有不同类型的士兵类。有效,现在接受,谢谢:)但是如果有人有更快的方法,我很想听到技能列表中cSkill的
:\n如果没有(s表示self.skills中的s,如果s.id==cSkill.id):\n self.skills.append(cSkill(self))
这会更快吗?@Mahi,不会。这会重复扫描self.skills,而不是快速的集合查找。等等,现在只测试了它<代码>名称错误:第49行没有定义全局名称“士兵”,这是
当前ID=set(…)
并且我已经修复了所有的拼写错误(一些是士兵,一些是士兵)Nvm,通过将其转换为正常的for循环来修复它
用于user.soldiers中的soldier:current_id.append(soldier.id)
介意为您的答案修正它,或者如果您有更好的答案,请给出其他修正?