我正在努力解决音乐椅问题。 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的新手。
答案 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]