繁体   English   中英

Python清单remove()移除超过1个元素

[英]Python List remove() removing more than 1 element

因此,我有一个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)

事实证明,如果选择了其中有两名玩家的班级,则此行将从teamA列表(进而又是teamB列表)中删除这两名玩家。 但是...我想在python中删除list只是删除了FIRST元素。 我误解了功能吗? 有什么可能的解决方案?

好的-问题似乎是由于迭代它们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]

咦? 大声笑;-) CPython实际上定义了这里发生的事情,但是依赖它绝不是一个好主意。

遍历列表的副本通常是修复它的最快方法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM