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このゲームのすべてのユーザーの各兵士タイプの1つのインスタンスを保存するために使用されます

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をセットに保存することで、リストを再スキャンするよりもはるかに高速に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 に答える