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)
介意为您的答案修正它,或者如果您有更好的答案,请给出其他修正?