0

だから私は2つのチームがあるpythonボットを持っていて、チームをスクランブルするはずのスクランブルコールがあります。2 つのチームはそれぞれリストに格納されており、それらをスクランブルする必要があります。(ランダムシャッフルを使用すると言う前に、ここでは機能しません)

各リストは辞書のリストです。各要素は、ユーザーに関する情報を含む辞書オブジェクトです。(例: ユーザーのニックネーム、ユーザー クラス、ユーザーの禁止ステータス、ユーザーの勝率など)

私はそれを変えることはできません - それは私の手に負えません。私は以下の解決策を思いつきました:

for i in switchingClassList: #switchingClassList is already filled with random classes that will be switched
        playerList = []
        for j in teamA:
            if j['class'][0] == i: #if the user's class matches one in switchingClassList, that user will be part of the scramble
                playerList.append(j)
                teamA.remove(j)
        for j in teamB:
            if j['class'][0] == i:
                playerList.append(j)
                teamB.remove(j) 
#there is more after, but that part works

だから、これはうまくいく...ちょっと。チームには 5 つの固有のクラスがあり、そのうちの 1 つを除いてすべて 1 人のプレーヤーが担当します。最後のクラスは 1 人のプレーヤーではなく、チームごとに 2 人のプレーヤーが受講します。

SwitchClassList に、クラスごとに 2 人のプレーヤーを持つクラスが含まれている場合、これは壊れます。

エラーを次の行までたどりました。

teamA.remove(j)

2 人のプレイヤーがいるクラスが選択された場合、この行は teamA リスト (および teamB リスト) から両方のプレイヤーを削除することがわかります。しかし... Pythonでリストを削除すると、FIRST要素のみが削除されたと思いました。関数を誤解していますか?これに対する潜在的な修正は何ですか?

4

1 に答える 1

4

teamAOK - 問題は、 andteamBリスト反復処理中に変更することによって引き起こされたようです。それはめったにありません;-)良い考えです。

>>> alist = range(10)
>>> alist
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for i, x in enumerate(alist):
...     if i < 5:
...         alist.remove(x)
...
>>> alist
[1, 3, 5, 7, 9]

は?LOL ;-) CPython は実際にここで何が起こるかを定義していますが、それに依存するのは決して良い考えではありません。

多くの場合、リストのコピーを反復処理することが最も迅速な修正方法です。

>>> alist = range(10)
>>> for i, x in enumerate(alist[:]):
...     if i < 5:
...         alist.remove(x)
...
>>> alist
[5, 6, 7, 8, 9]
于 2013-10-08T02:08:40.313 に答える