Переместить один или несколько последовательных элементов в списке в любую позицию - PullRequest
1 голос
/ 08 апреля 2020

Мне нужно переместить один или несколько последовательных элементов в списке, по порядку я имею в виду, что если элементов больше одного, то в их списочных индексах нет пробелов, вот что я пробовал ...

def move(x, tomove, idx):
    move_start = tomove[0]
    move_end = tomove[-1] + 1
    if idx == len(x) or idx == len(x) - 1:
        return x[:move_start] + x[move_end:] + x[move_start:move_end]
    elif idx == 0:
        return x[move_start:move_end] + x[:move_start] + x[move_end:]
    else:
        pass

# move to start
print (move([0,1,2,3,4,5,6],
            [2],
            0))
# expected output [2,0,1,3,4,5,6]

# move to end
print (move([0,1,2,3,4,5,6],
            [2],
            6))
# expected output [0,1,3,4,5,6,2]

# move forward single
print (move([0,1,2,3,4,5,6],
            [2],
            3))
# expected output [0,1,3,2,4,5,6]

# move backward single
print (move([0,1,2,3,4,5,6],
            [2],
            1))
# expected output [0,2,1,3,4,5,6]

# move forward multiple
print (move([0,1,2,3,4,5,6],
            [2,3],
            5))
# expected output [0,1,4,5,2,3,6]

# move backward multiple
print (move([0,1,2,3,4,5,6],
            [4,5],
            2))
# expected output [0,1,4,5,2,3,6]

1 Ответ

1 голос
/ 08 апреля 2020

Поскольку вы ничего не упомянули о проверке, например, если заданная последовательность элементов отсутствует в исходном списке, упорядочение основного списка и заданного списка и т. Д. c. Я не рассматривал никаких проверок.

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

move_list_pos = lis.index(move_list[0])

Теперь проверьте, будет ли данный список перемещаться вперед или назад.

  • Если ему нужно двигаться назад, то в основном списке его нет до новой позиции, вставьте данный список, продолжите основной список, за исключением данного списка.
  • Если нужно двигаться вперед, тогда главный список должен быть там, за исключением указанного списка в главном списке до новой позиции, добавить данный список, продолжить основной список с новой позиции до конца.

Код решения:

def move(lis,move_list,pos):
    move_list_pos = lis.index(move_list[0])
    if pos<move_list_pos:
        return lis[:pos]+move_list+lis[pos:move_list_pos]+lis[move_list_pos+len(move_list):]
    else:
        return lis[:move_list_pos]+lis[move_list_pos+len(move_list):pos+1]+move_list+lis[pos+1:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...