Python 在while循环结构中返回带有圆锥运动的有序元素列表

Python 在while循环结构中返回带有圆锥运动的有序元素列表,python,loops,Python,Loops,我试图解决一个任务,其中有13盏灯,从1开始,每5盏灯关闭一次,当计数达到13时,再次从第一项开始。该函数应返回指示灯关闭的顺序。在这种情况下,对于包含13项的列表,返回列表将是[5、10、2、8、1、9、4、13、12、3、7、11、6]。此外,关闭的灯将不再计算 所以我处理这个问题的方法是有一个名为turnedon的列表,它是[1,2,3,4,5,6,7,8,9,10,11,12,13]和一个名为orderoff的空列表,每当列表中的灯熄灭时,它就会附加到这个列表中。因此,当turnedon

我试图解决一个任务,其中有13盏灯,从1开始,每5盏灯关闭一次,当计数达到13时,再次从第一项开始。该函数应返回指示灯关闭的顺序。在这种情况下,对于包含13项的列表,返回列表将是
[5、10、2、8、1、9、4、13、12、3、7、11、6]
。此外,关闭的灯将不再计算

所以我处理这个问题的方法是有一个名为
turnedon
的列表,它是
[1,2,3,4,5,6,7,8,9,10,11,12,13]
和一个名为
orderoff
的空列表,每当
列表中的灯熄灭时,它就会附加到这个列表中。因此,当
turnedon
不为空时,迭代
turnedon
列表,附加关闭的灯,并从
turnedon
列表中删除该
turnedon
灯,如果有意义的话。但是我不知道while循环应该包含什么。任何想法都将不胜感激

def orderoff():
    n=13
    turnedon=[]
    for n in range(1,n+1):
        turnedon.append(n)
    orderoff=[]

    while turneon !=[]:

我认为一个更好的解决方案是使用一个循环,每次增加位移,并使用模块将数字保持在范围内

def orderoff(lights_num,step):
    turnd_off=[]
    num =0
    for i in range(max):
        num =((num+step-1)%lights_num)+1
        turnd_off.append(num)
    return turnd_off

print(orderoff(13))

我认为一个更好的解决方案是使用一个循环,每次增加位移,并使用模块将数字保持在范围内

def orderoff(lights_num,step):
    turnd_off=[]
    num =0
    for i in range(max):
        num =((num+step-1)%lights_num)+1
        turnd_off.append(num)
    return turnd_off

print(orderoff(13))

这是可行的,但结果与您的不同:

>>> pos = 0
>>> result = []
>>> while len(result) < 13 :
...     pos += 5
...     pos %= 13
...     if pos not in result :
...         result.append(pos)
... 
>>> result = [i+1 for i in result]  # make it 1-based, not 0-based
>>> result
[6, 11, 3, 8, 13, 5, 10, 2, 7, 12, 4, 9, 1]
>>>
>>pos=0
>>>结果=[]
>>>而len(结果)<13:
...     位置+=5
...     pos%=13
...     如果没有结果:
...         结果追加(pos)
... 
>>>结果=[i+1表示结果中的i]#以1为基础,而不是以0为基础
>>>结果
[6, 11, 3, 8, 13, 5, 10, 2, 7, 12, 4, 9, 1]
>>>

这是可行的,但结果与您的不同:

>>> pos = 0
>>> result = []
>>> while len(result) < 13 :
...     pos += 5
...     pos %= 13
...     if pos not in result :
...         result.append(pos)
... 
>>> result = [i+1 for i in result]  # make it 1-based, not 0-based
>>> result
[6, 11, 3, 8, 13, 5, 10, 2, 7, 12, 4, 9, 1]
>>>
>>pos=0
>>>结果=[]
>>>而len(结果)<13:
...     位置+=5
...     pos%=13
...     如果没有结果:
...         结果追加(pos)
... 
>>>结果=[i+1表示结果中的i]#以1为基础,而不是以0为基础
>>>结果
[6, 11, 3, 8, 13, 5, 10, 2, 7, 12, 4, 9, 1]
>>>

这个问题相当于众所周知的问题,在这个问题中,
n
囚犯站成一个圆圈,他们按顺序被杀,每次,下一个被杀的人是
k
从上一个人绕圆圈走一圈;台阶只算在剩下的囚犯身上。可以在上找到Python的示例解决方案,我在下面对其稍作修改:

def josephus(n,k): p=列表(范围(1,n+1)) i=0 seq=[] 而p: i=(i+k-1)%len(p) 附页(p.pop(i)) 返回顺序
例如:

约瑟夫(13,5) [5, 10, 2, 8, 1, 9, 4, 13, 12, 3, 7, 11, 6]
这个问题相当于众所周知的问题,在这个问题中,
n
囚犯站成一个圆圈,他们按顺序被杀,每次,下一个被杀的人是
k
从上一个人绕圆圈走一圈;台阶只算在剩下的囚犯身上。可以在上找到Python的示例解决方案,我在下面对其稍作修改:

def josephus(n,k): p=列表(范围(1,n+1)) i=0 seq=[] 而p: i=(i+k-1)%len(p) 附页(p.pop(i)) 返回顺序 例如:

约瑟夫(13,5) [5, 10, 2, 8, 1, 9, 4, 13, 12, 3, 7, 11, 6]
[5,10,2,8,1,9,4,13,12,3,7,11,6]
看起来不正确。5-1=4,10-5=5,2-10=5——数字不同,4或5@lenik-“同样,关了灯也不算了。”你数5步点亮#5,然后5步点亮#10,然后5步点亮#2,然后接下来的5步点亮#8,因为#5已经关了,所以你不应该数。基于纯模运算的解决方案不会给出正确的结果,因为它没有这种行为。如果项目数和步长不是互质,您的预期输出是什么?@FBruzzesi,例如4个灯光,步长为2,关闭的第一个灯光是#2,然后是#4,然后剩下的灯是#1和#3,因此步进2表示#3下一步关闭。所以输出应该是[2,4,3,1]。@kaya3谢谢你的澄清,你之前的评论让我意识到了这一点。
[5,10,2,8,1,9,4,13,12,3,7,11,6]
看起来不正确。5-1=4,10-5=5,2-10=5——数字不同,4或5@lenik-“同样,关了灯也不算了。”你数5步点亮#5,然后5步点亮#10,然后5步点亮#2,然后接下来的5步点亮#8,因为#5已经关了,所以你不应该数。基于纯模运算的解决方案不会给出正确的结果,因为它没有这种行为。如果项目数和步长不是互质,您的预期输出是什么?@FBruzzesi,例如4个灯光,步长为2,关闭的第一个灯光是#2,然后是#4,然后剩下的灯是#1和#3,因此步进2表示#3下一步关闭。因此,输出将是[2,4,3,1]。@kaya3感谢您的澄清,您之前的评论让我已经意识到了这一点。为了获得最佳实践,我建议避免对变量使用名称
max
,因为它是一个内置函数。此外,由于您创建了一个函数,因此传递一个步骤参数而不是硬编码是值得的。您的结果:
[5,10,2,7,12,4,9,1,6,11,3,8,13]
与OP quoted不同。为了获得最佳实践,我建议避免对变量使用名称
max
,因为它是一个内置函数。此外,由于您创建了一个函数,因此传递一个步骤参数而不是硬编码是值得的。您的结果:
[5,10,2,7,12,4,9,1,6,11,3,8,13]
与OP quotedThank!!但是,k在函数中代表什么?
k
是每次计算的步数;5.在你的例子中也是