Переверните половину списка и добавьте его к себе

#python #python-3.x #list

#питон #python-3.x #Список

Вопрос:

Я пытаюсь перевернуть половину элементов внутри списка, а затем потратить их на себя, например, если я передам список [1, 8, 7, 2, 9, 18, 12, 0] в это, я должен попасть [1, 0, 7, 18, 9, 2, 12, 8] вон, вот мой текущий код

 def flip_half(list):  for i in range(0,len(list)):  if i % 2 != 0:  listflip = list[i]   print(listflip)      return list  

Ответ №1:

Вы можете напрямую назначать срезы в python. Поэтому, если вы можете определить срез, который вы хотите назначить от и до, вы можете напрямую изменить элементы. Это присваивается от каждого другого элемента в обратном l[::-2] порядке каждому другому элементу, начиная со второго: l[1::2] :

 l = [1, 8, 7, 2, 9, 18, 12, 0]  l[1::2] = l[::-2] print(l) #[1, 0, 7, 18, 9, 2, 12, 8]  

Комментарии:

1. но этот код имеет неправильный результат нечетной длины.

2. Неясно (по крайней мере, для меня), что вопрос имеет смысл при вводе нечетной длины.

3. Я согласен с вами. Не ясная задача. Я думаю, что безопасная версия-это l[1::2] = l[1::2][::-2]

Ответ №2:

Если бы вы хотели сделать это в цикле:

 def flip_half(list):  out = []  for i in range(0,len(list)):  if i % 2 != 0:  out.append(list[-i])  else:   out.append(list[i])  return out  print(flip_half([1, 8, 7, 2, 9, 18, 12, 0]))  

Комментарии:

1. или [list[i] if i % 2 == 0 else list[-(i len(list)%2)] for i in range(len(list))]

Ответ №3:

Если вам нужно, чтобы элементы с нечетными индексами имели обратный порядок, то одно из следующих решений ( l — это ваш список):

Ломтики

 l[1::2] = l[1::2][::-1]  

Понимание списка

 l = [l[i] if i % 2 == 0 else l[-(i   len(l)%2)] for i in range(len(l))]  

Функция

 def flip_half(lst):  res= []  for i in range(len(lst)):  if i % 2 != 0:  res.append(lst[-(i   len(lst) % 2)])  else:   res.append(lst[i])  return res  l = flip_half(l)  

Функция генератора

 def flip_half(lst):  for i in range(len(lst)):  if i % 2 != 0:  yield lst[-(i   len(lst) % 2)]  else:   yield lst[i]  l = list(flip_half(l))