удаление каждого 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')
>>>