从Python 2.7列表中删除第n个元素

从Python 2.7列表中删除第n个元素,python,python-2.7,list,Python,Python 2.7,List,我已将此任务设置为以下任务: 你是一艘帆船的船长,你和你的船员被海盗抓获了。海盗船长让你们大家围成一圈站在他的船的甲板上,试图决定你们应该按什么顺序在木板上行走。最终,他决定采用以下方法: (a) 海盗船长让你选一个数字 (b) 第一个走木板的人将是第n个人 (从你开始) (c) 然后,船长将继续绕圆圈飞行,每N圈一次 人走木板 (d) 一旦只剩下一个人,这个人就会被解雇 自由 例如:机组人员包括:安德鲁、布伦达、克雷格、戴德雷、, 爱德华、费利西蒂、格雷格和哈丽特。安德鲁选择N=2。机组人员将

我已将此任务设置为以下任务:

你是一艘帆船的船长,你和你的船员被海盗抓获了。海盗船长让你们大家围成一圈站在他的船的甲板上,试图决定你们应该按什么顺序在木板上行走。最终,他决定采用以下方法:

(a) 海盗船长让你选一个数字

(b) 第一个走木板的人将是第n个人 (从你开始)

(c) 然后,船长将继续绕圆圈飞行,每N圈一次 人走木板

(d) 一旦只剩下一个人,这个人就会被解雇 自由

例如:机组人员包括:安德鲁、布伦达、克雷格、戴德雷、, 爱德华、费利西蒂、格雷格和哈丽特。安德鲁选择N=2。机组人员将 按顺序走木板:布伦达、戴德雷、费利西蒂、哈丽特、克雷格、, 格雷格,爱德华。安德鲁将获得自由

我在这里发现了一个与此任务相关的问题,并给出了答案,但我想知道我的代码哪里出了问题,必须能够在不使用之前答案中使用的模块的情况下进行操作

以下是我到目前为止的情况:

def survivor(names, step):
    next = step

    while len(names) > 1:
        names.pop(next)
        next = next + step - 1
        if next > len(names):
            next = next - len(names)

    return names[0]
下面是错误:

Pirates.survivor(["Andrew", "Brenda", "Craig", "Deidre", "Edward", "Felicity", "Greg", "Harriet"], 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "Pirates.py", line 30, in survivor
    names.pop(next)
IndexError: pop index out of range
海盗。幸存者([“安德鲁”、“布伦达”、“克雷格”、“戴德雷”、“爱德华”、“费利西蒂”、“格雷格”、“哈里特”],3)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
幸存者中第30行的文件“Pirates.py”
names.pop(下一个)
索引器:弹出索引超出范围

索引错误意味着代码试图访问列表中不存在的索引。当我在每次while循环迭代结束时打印出
next
变量时,我得到以下结果:

5
1
3
1
3
由于python从
0
开始索引,而且此时列表中只有3个元素,因此它会查找
名称[3]
,但列表只会上升到
名称[2]


此外,我不会使用
next
作为变量,因为它是一个关键字。

因为计算机科学中的计数从0开始,您需要以更新它的相同方式初始设置
next
,即

next = step - 1
在给出的示例中,您正在使用
N=2
运行,并且应该返回Brenda,但是如果您不将步长减1,您将首先弹出
'Craig'
。进行此更改将使代码运行并输出给定示例的正确结果

我建议的另一个更改是使用模运算符来确保
next
始终是
名称的有效索引。它更简洁,也更容易理解:

next = (next + step - 1) % len(names)
综上所述,您有以下几点:

def survivor(names, step):
    next = step-1

    while len(names) > 1:
        print "-", names.pop(next), "walked"
    next = (next + step - 1) % len(names)

    return names[0]

print survivor(["Andrew", "Brenda", "Craig", "Deidre", "Edward", "Felicity", "Greg", "Harriet"], 2), "survived!"
输出:

- Brenda walked
- Deidre walked
- Felicity walked
- Harriet walked
- Craig walked
- Greg walked
- Edward walked
Andrew survived!

最后,正如其他地方所指出的,不要用内置函数命名变量,比如
next

尝试
next=(next+step-1)%len(names)
,这样你就可以去掉
next>len(names)
,但是的,next是一个糟糕的变量名。。。另外,我不确定你是否需要它的-1部分。在给我们的伪代码中,我们被告知下一步使用变量,但感谢你指出,要使用模,而不是检查
next>len(name)
作为旁白,它不应该是
if next>=len(name)
…因为
a[len(a)]
会引发索引不存在的异常吗?@JoranBeasley:很好,添加了!