在python中控制for循环的流程

时间:2014-07-07 09:17:57

标签: python list for-loop

我正在努力解决音乐椅问题。 list_of_people是包含圈子中人员位置的列表。 steps变量是歌曲的长度。因此steps来自list_of_people的每个steps元素。最后应该只有一个元素。我试图通过使用一个简单的for循环来解决这个问题。我正在删除计数中每个integer的循环中的元素。我有两个要求:1。)当我删除一个元素时,我想从当前位置退回循环中的一个位置。因此,当我删除时,我将itertools.cycle设置为前一个元素,因此下一次应该从该位置开始。但那不起作用 2.)当到达最后一个元素时,我想从第一个位置重新启动for循环。

我知道python list_of_people中有一个用于循环迭代的规定,但问题是len()函数不可用而且我通过检查count=0 list_of_people = list(range(1,inputlength+1)) for integer in list_of_people: if count==steps: print("Element removed: "+str(integer)) #Getting the previous index previous = list_of_people.index(integer)-1; #deleting the current element del list_of_people[list_of_people.index(integer)] #Setting the index to previous element, THIS IS NOT WORKING! #Need some help here!!!!! integer = list_of_people[previous] count=0 if len(list_of_people) < 2:#This is the breaking condition break #I need some help here!!! #I need to restart the for loop from the first position if list_of_people.index(integer)==len(list_of_people)-1: #Set the loop index to zero count+=1 print("The remaining element: "+str(list_of_people[0])) <的长度打破了我的for循环/ p>

{{1}}

有人可以帮我这个吗?如果代码中有任何错误,请原谅我,我是python的新手。

1 个答案:

答案 0 :(得分:0)

尝试在迭代时从列表中删除内容是非常不明智的。而是构建一个新列表,例如使用list comprehension

list_of_people = [p for i, p in enumerate(list_of_people) if (i + 1) % steps]

一个简单的例子:

>>> people = range(10)
>>> [p for i, p in enumerate(people, 1) if i % 3]
[0, 1, 3, 4, 6, 7, 9]

根据您的澄清评论,我认为您想要的只是:

def musical_chairs(people, steps):
    index = 0
    people = list(people)
    while len(people) > 1:
        index = (index + steps) % len(people)
        del people[index]
        index -= 1
    return people

演示:

>>> musical_chairs(range(1, 11), 4)
[6]