![](/img/trans.png)
[英]Is removing a list element by index more efficient than removing it by value?
[英]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元素。 我误解了功能吗? 有什么可能的解决方案?
好的-问题似乎是由于在迭代它们时对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]
咦? 大声笑;-) 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.