在Python2.7中从列表中删除每n个元素

在Python2.7中从列表中删除每n个元素,python,python-2.7,Python,Python 2.7,我被赋予了一项任务,为其创建代码。任务如下: 你是一艘帆船的船长,你和你的船员 被海盗抓获。海盗船长让你们全体起立 在他船的甲板上围成一圈,试图决定顺序 你应该走木板。最终他决定了以下几点 方法: (a) 海盗船长让你选一个数字 (b) 第一个走木板的人将是第n个人(从 你) (c) 船长随后将继续绕着圆圈飞行 每N个人都要走木板 (d) 曾经只有一个人 左,那个人将获得自由 例如:船员 包括:安德鲁、布伦达、克雷格、戴德雷、爱德华、费利西蒂、格雷格和 哈丽特。安德鲁选择N=2。船员将按以下顺

我被赋予了一项任务,为其创建代码。任务如下:

你是一艘帆船的船长,你和你的船员 被海盗抓获。海盗船长让你们全体起立 在他船的甲板上围成一圈,试图决定顺序 你应该走木板。最终他决定了以下几点 方法:

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

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

(c) 船长随后将继续绕着圆圈飞行 每N个人都要走木板

(d) 曾经只有一个人 左,那个人将获得自由

例如:船员 包括:安德鲁、布伦达、克雷格、戴德雷、爱德华、费利西蒂、格雷格和 哈丽特。安德鲁选择N=2。船员将按以下顺序行走木板: 布伦达,戴德,费利西蒂,哈丽特,克雷格,格雷格,爱德华。安德鲁会的 给予自由

到目前为止,我掌握的代码是:

def survivor(names, step):
    names =  ["Andrew", "Brenda", "Craig", "Deidre", "Edward", "Felicity", "Greg", "Harriet"]
    Next = step - 1
    names.pop(Next)
    print names
这将从列表中删除第一个第n个人,但我不确定如何循环列表以继续删除第n个人

我需要它,所以让我们假设步骤=3,然后我需要它来删除craig,然后从craig开始计数,删除下一个第三个元素,即felicity,依此类推,直到剩下一个人

我怎样才能做到这一点?

这似乎有效:

from collections import deque
def survivor(names, step):     
    circle = deque(names)
    while len(circle) > 1:
        circle.rotate(1-step)
        print circle.popleft()
    return circle[0]
它打印海盗受害者的姓名,并返回幸存者的姓名:

In [17]: crew = ["Andrew", "Brenda", "Craig", "Deidre",
   ....: "Edward", "Felicity", "Greg", "Harriet"]

In [18]: survivor(crew, 2)
Brenda
Deidre
Felicity
Harriet
Craig
Greg
Edward
Out[18]: 'Andrew'

In [19]: survivor(crew, 3)
Craig
Felicity
Andrew
Edward
Brenda
Harriet
Deidre
Out[19]: 'Greg'

以下代码应完成您要求的所有操作,包括实现
safeN
功能:

import collections
import itertools

def walk_plank(names, N):
    "Walk everyone down the plank."
    circle = collections.deque(names)
    while circle:
        circle.rotate(-N)
        yield circle.pop()

def save_last(names, N):
    "Save the last person from walking the plank."
    for name in walk_plank(names, N):
        pass
    return name

def safeN(names, name):
    "Find the best N to save someone from walking the plank."
    assert name in names, 'Name must be in names!'
    for N in itertools.count(1):
        if save_last(names, N) == name:
            return N
编辑:下面是在Windows中使用空闲时使用上述代码的一些示例

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import collections, itertools
>>> def walk_plank(names, N):
        "Walk everyone down the plank."
        circle = collections.deque(names)
        while circle:
            circle.rotate(-N)
            yield circle.pop()

>>> def save_last(names, N):
        "Save the last person from walking the plank."
        for name in walk_plank(names, N):
            pass
        return name

>>> def safeN(names, name):
        "Find the best N to save someone from walking the plank."
        assert name in names, 'Name must be in names!'
        for N in itertools.count(1):
            if save_last(names, N) == name:
                return N

>>> names = 'Andrew Brenda Craig Deidre Edward Felicity Greg Harriet'.split()
>>> tuple(walk_plank(names, 2))
('Brenda', 'Deidre', 'Felicity', 'Harriet', 'Craig', 'Greg', 'Edward', 'Andrew')
>>> save_last(names, 2)
'Andrew'
>>> safeN(names, 'Andrew')
2
>>> safeN(names, 'Brenda')
19
>>> save_last(names, 19)
'Brenda'
>>> tuple(walk_plank(names, 19))
('Craig', 'Harriet', 'Andrew', 'Felicity', 'Deidre', 'Edward', 'Greg', 'Brenda')
>>> 

因此,做出选择的人总是列表中的第一个?我在第一部分使用了自己的代码,即:Next=step-1,而len(names)>1:names。pop(Next)Next=Next+step Next=(Next-1)%len(names)print names返回名称[0]这对返回survivor有效,但当我尝试实现建议的第二部分时,它似乎也不起作用,我尝试过使用以下方法:在名称中为步骤中的survivor(名称,步骤)断言名称:如果survivor==name:但不起作用,则表示UnboundLocalError:在赋值返回步骤之前引用了局部变量“步骤”谢谢Lev,这很好用。你不知道我有多感激这一点,我被困在这上面很久了。感谢YOU@user1839493只有当你理解它是如何工作的,而不是仅仅把它交给老师(如果我猜错了,对不起),这才有帮助。另外,如果它解决了你的问题,你也可以。然后你能给我解释一下deque部分吗?@user1839493是我在本例中用来实现“圆”的对象。它很像一个列表,但可以从两端轻松访问,并且有一个
rotate
方法。请查看我链接到的文档页面,了解
rotate
popleft
@user1839493的说明这肯定太多了,无法在评论中解决。我建议你花点时间自己想办法。提示:您可以在循环中使用
survivor
,增加
step
,直到结果是所需的名称,然后
step
的值就是答案。如果您有任何问题,请发布另一个问题。感谢您的帮助Noctis Skytower,我现在可以实现任务的第二部分了。我使用了自己的代码来完成第一部分,即:Next=step-1,而len(names)>1:names.pop(Next)Next=Next+step Next=(Next-1)%len(names)打印名称返回名称[0],该名称可用于返回幸存者,但当我尝试实现建议的第二部分时,它似乎也不起作用,我尝试使用以下方法:在名称中为步骤幸存者(名称,步骤)断言名称:如果survivor==name:但它不起作用,则表示UnboundLocalError:在分配返回之前引用的局部变量'step'step@user1839493:确保您正在使用Python 3.3运行代码。将给出代码使用的示例。