как собирать элементы в списке каждые 3 места, пока ничего не осталось - PullRequest
0 голосов
/ 27 мая 2020

вот что мне нужно сделать:

[1,2,3,4,5,6,7] - начальная последовательность

[1,2,4,5, 6,7] => 3 отсчитывается и переходит в результат [3]

[1,2,4,5,7] => 6 отсчитывается и переходит в результат [3,6 ]

[1,4,5,7] => 2 отсчитывается и переходит в результат [3,6,2]

[1,4,5] => 7 отсчитывается и переходит в результат [3,6,2,7]

[1,4] => 5 отсчитывается и переходит в результат [3,6,2,7,5]

[4] => 1 отсчитывается и переходит в результат [3,6,2,7,5,1]

[] => 4 отсчитывается и переходит в результат [3,6,2,7,5,1,4]

1 Ответ

0 голосов
/ 27 мая 2020

Рассмотрим следующий код python:

s=[1,2,3,4,5,6,7]

result=[] 
cur_idx=0
while 1:
  print s,result
  if(len(s))==0:
    break
  if cur_idx<len(s)-2:
    cur_idx=cur_idx+2
  else:
    cur_idx= (len(s)-2+cur_idx) % len(s) -1
  result.append(s[cur_idx])
  del s[cur_idx]

Он делает почти то, что вы хотите:

[1, 2, 3, 4, 5, 6, 7] []
[1, 2, 4, 5, 6, 7] [3]
[1, 2, 4, 5, 7] [3, 6]
[1, 4, 5, 7] [3, 6, 2]
[1, 4, 5] [3, 6, 2, 7]
[4, 5] [3, 6, 2, 7, 1]
[4] [3, 6, 2, 7, 1, 5]
[] [3, 6, 2, 7, 1, 5, 4]

На самом деле разница в том, когда 7 удален, потому что вы считаете «виртуальный индекс». Я нашел утомительное решение, чтобы справиться с этим:

s=[1,2,3,4,5,6,7]

result=[] 
cur_idx=0
while 1:
  print s,result,cur_idx,len(s)
  if(len(s))==1:
    result.append(s[0])
    s=[]
    print "final result:", result
    break
  if cur_idx<len(s)-2:
    cur_idx=cur_idx+2
  else:
    cur_idx= len(s)-cur_idx
    if cur_idx==len(s):
      cur_idx=0
  result.append(s[cur_idx])
  del s[cur_idx]
  if cur_idx==len(s):
      cur_idx=0

Это приводит к:

[1, 2, 3, 4, 5, 6, 7] [] 0 7
[1, 2, 4, 5, 6, 7] [3] 2 6
[1, 2, 4, 5, 7] [3, 6] 4 5
[1, 4, 5, 7] [3, 6, 2] 1 4
[1, 4, 5] [3, 6, 2, 7] 0 3
[1, 4] [3, 6, 2, 7, 5] 0 2
[4] [3, 6, 2, 7, 5, 1] 0 1
final result: [3, 6, 2, 7, 5, 1, 4]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...