Python列表remove()删除多个元素

时间:2013-10-08 01:20:12

标签: python list

所以我有一个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元素。我误解了这个功能吗?对此有什么潜在的解决方法?

1 个答案:

答案 0 :(得分: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]
相关问题