удаление каждого n-го элемента из списка в python 2.7

мне дали задачу создать код для. Задача заключается в следующем:

вы капитан парусного судна, и вы и ваша команда был захвачен пиратами. У пиратского капитана есть все вы, стоящие в кругу на палубе своего корабля, пытаясь решить, в каком порядке ты должен пройти по доске. В конце концов он решает следующее: метод:

(a) пиратский капитан просит вас выбрать число N.

(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, затем мне нужно удалить Крейга, а затем рассчитывать от Крейга вперед и удалить следующий 3-й элемент, который является Фелисити и так далее, пока не будет один человек ушел.

Как я могу это сделать?

2 ответов


Это, кажется, работает:

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

Edit: вот пример использования кода выше при работе с IDLE в 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')
>>>