在迭代时从Python列表中删除项目 [英] Delete item from list in Python while iterating over it

查看:164
本文介绍了在迭代时从Python列表中删除项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为锦标赛应用程序编写循环算法.

I'm writing a round robin algorithm for a tournament app.

当玩家人数为奇数时,我将'DELETE'添加到玩家列表中,但是稍后,当我想从日程表列表中删除包含'DELETE'的所有项目时,我不能-总是一个左边.请看一下代码-问题很简单,我想它是关于列表的.我只是看不到.

When the number of players is odd, I add 'DELETE' to the list of players, but later, when I want to delete all items from schedule list that contain 'DELETE', I can't -- one is always left. Please take a look at the code -- the problem is simple and I suppose it's about lists; I just i can't see it.

"""
Round-robin tournament:
1, 2, 3, 4, | 5, 6, 7, 8    =>  1, 2, 3, 4  => rotate all but 1 =>  1, 5, 2, 3  => repeat =>    1, 6, 5, 2  ...
                    5, 6, 7, 8              6, 7, 8, 4          7, 8, 4, 3
in every round pick l1[0] and l2[0] as first couple, after that l1[1] and l2[1]...
"""

import math

lst = []
schedule = []
delLater = False

for i in range(3):                  #make list of numbers
    lst.append(i+1)

if len(lst) % 2 != 0:               #if num of items is odd, add 'DELETE'
    lst.append('DELETE')
    delLater = True


while len(schedule) < math.factorial(len(lst))/(2*math.factorial(len(lst) - 2)): #!(n)/!(n-k)

    mid = len(lst)/2

    l1 = lst[:mid]
    l2 = lst[mid:]

    for i in range(len(l1)):            
        schedule.append((l1[i], l2[i]))         #add lst items in schedule

    l1.insert(1, l2[0])             #rotate lst
    l2.append(l1[-1])
    lst = l1[:-1] + l2[1:]


if delLater == True:                #PROBLEM!!! One DELETE always left in list
    for x in schedule:
        if 'DELETE' in x:
            schedule.remove(x)

i = 1
for x in schedule:
    print i, x
    i+=1

推荐答案

在遍历列表时,请勿修改列表:

You shouldn't modify the list while iterating over it:

for x in schedule:
    if 'DELETE' in x:
        schedule.remove(x)

相反,请尝试:

schedule[:] = [x for x in schedule if 'DELETE' not in x]

有关更多信息,请参见如何从迭代时列出?

For more info, see How to remove items from a list while iterating?

这篇关于在迭代时从Python列表中删除项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆