У меня есть список элементов, которые мне нужно циклически менять, чтобы я соблюдал их порядок. Проблема кажется довольно простой, но я не могу найти разумный способ ее кодирования. Скажем, у вас есть элементыаранжировать товары с соблюдением порядка
1 2 3 4 o o o 5 6 7
Выходов всегда являются смежными в массиве, но мне нужно, чтобы изменить этот массив, так что о (которые не обязательно являются разного типа) являются последним циклическим способом:
5 6 7 1 2 3 4 o o o
Проблема в том, что o может быть также смежным циклическим способом. Например,
o o 1 2 3 4 5 6 7 o
Есть ли разумный способ сделать это? Я смотрел на cycle
из itertools, но на данный момент у меня нет рабочей реализации, поскольку то, что я сделал, не может справиться с последним случаем.
ОБНОВЛЕНИЕ
У меня есть первый рабочий реализации:
def arrange2(nodes, contiguous):
arranged = []
size = len(nodes)
if nodes[0] in contiguous:
# obtain the id of the last interface node in nodes
id = None
for i in range(1, len(nodes)):
if nodes[i] not in contiguous:
id = i
break
# copy nodes to new list starting from the first node past id
for i in range(id, id + size):
arranged += [nodes[i % size]]
else:
# obtain the id of the last interface node in nodes
id = None
for i in range(size - 1, -1, -1):
if nodes[i] in contiguous:
id = i
break
# copy nodes to new list starting from the first node past id
for i in range(id+1, id + size+1):
arranged += [nodes[i % size]]
return arranged
print(arrange2([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [5, 6]))
Это печатает [7, 8, 9, 10, 1, 2, 3, 4, 5, 6]
могли бы вы предоставить более реальные примеры? Я не понимаю, почему смежный должен быть '[5,6]', а не только 6. – Mel
Вы можете взять любой набор смежных чисел из этого списка.Я взял '[5,6]' в качестве примера, но вы могли бы взять '[9, 10, 1, 2]', который является непрерывным циклическим способом, или '[10, 1, 2]' и т. Д. – aaragon
Но какая разница между «Я хочу 2 в конце» и «Я хочу 10,1,2» в конце? Если вы положите 2 в конце и сохраните заказ, тогда у вас будет «10,1,2» в конце. – Mel