所以我有一个python机器人,其中有2个团队,并且有一个应该扰乱团队的争夺调用。这两个团队每个都存储在一个列表中,我必须加扰它们。 (现在在你说使用随机shuffle之前,这在这里不起作用)
每个列表都是字典列表 - 每个元素都是一个包含用户信息的字典对象。 (例如用户缺口,用户类,用户禁止状态,用户获胜%等)
我无法改变 - 这是我无法控制的。我想出了下面的解决方案:
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玩家。 但是......我认为list中的list删除只删除了FIRST元素。我误解了这个功能吗?对此有什么潜在的解决方法?
答案 0 :(得分:4)
好的 - 问题似乎是由于teamA
和teamB
列表突变而迭代它们造成的。这很少;-)一个好主意。
>>> 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]