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

时间:2013-11-18 18:13:04

标签: python list python-2.7 pop

我已经在下面设置了这个任务:

  

你是一艘帆船的船长,你和你的船员被海盗俘虏了。海盗船长让你们所有人在他的船甲板上站成一圈,试图决定你应该走哪条木板。最终他决定采用以下方法:

     

(a)海盗船长要求你挑选一个号码。

     

(b)第一个走板的人是第N人   (从你开始)。

     

(c)然后队长将继续围绕圆圈强迫每个N.   走路的人。

     

(d)一旦只剩下一个人,将给予该人   自由度。

     

例如:工作人员包括:Andrew,Brenda,Craig,Deidre,   爱德华,费利西蒂,格雷格和哈丽特。安德鲁选择N = 2。船员会   按顺序走木板:Brenda,Deidre,Felicity,Harriet,Craig,   格雷格,爱德华。安德鲁将获得自由。

我在这里找到了一个与此任务相关的问题和答案,但我想知道我的代码在哪里出错了,必须可以不使用以前答案中使用的模块。

到目前为止我所拥有的:

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

2 个答案:

答案 0 :(得分:2)

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

next = step - 1

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

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

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之后命名变量。

答案 1 :(得分:0)

您的索引错误意味着您的代码正在尝试访问列表中不存在的索引。当我在每个while循环迭代结束时打印出next变量时,我得到了这个:

5
1
3
1
3

由于python开始在0开始编制索引,并且由于此时列表中只有3个元素,因此它会查找names[3],但您的列表只会上升到names[2] < / p>

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