0

所以我有一个 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 名玩家占据。最后一节课不是由一名球员参加,而是由每队两名球员参加。

如果 SwitchClassList 包含每个班级有 2 个玩家的班级,那么这个东西就会中断。

我将错误追溯到这一行:

teamA.remove(j)

事实证明,如果选择了包含两名球员的班级,则此行会从 teamA 列表(然后是 teamB 列表)中删除 BOTH 球员。但是......我认为python中的列表删除只删除了第一个元素。我误解了这个功能吗?对此有什么潜在的解决办法?

4

1 回答 1

4

好的 - 问题似乎是由迭代它们时改变teamAteamB列表引起的。这很少;-) 一个好主意。

>>> 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 回答