#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))