@sasha300

Как поменять местами первую и вторую половины НЕЧЕТНОГО списка?

Всем привет!
Вот тз:
Дан список числовых значений, насчитывающий N элементов. Поменяйте местами
первую и вторую половины списка.

Наваял скрипт:
a = [4,6,7,8,1,5]
b = len(a)//2
for i in range(b):
    temp = a[b]
    a[b] = a[i]
    a[i] = temp
    b = b + 1    
print(a)

Код отрабатывает задачу, но если список нечетный, т.е. к примеру:
a = [4,6,7,8,1,5,3]

то на выводе получаю:
[8, 1, 5, 4, 6, 7, 3]

Т.е. последнее значение списка a[-1] "пролетает". На выводе должно быть что-то похожее:
8,1,5,3, 4,6,7
или
1,5,3, 4,6,7,8

Вобщем без разницы в первой половине будет больше значений или во второй, главное как это дело реализовать?
Думал, может с помощью if сделать условие для нечетного списка, но уже пару часов думаю и ничего толкового на ум не приходит =(
Заранее признателен за ответы!
  • Вопрос задан
  • 6481 просмотр
Решения вопроса 1
@deliro
a = [4,6,7,8,1,5,3]
b = len(a) // 2
print(a[b:] + a[:b])


И не надо велосипедов изобретать, прочитай основы питона

Если же в задании строго запрещены срезы списков, то итерируйся по длине списка, прибавляй туда длину первой половины списка и бери остаток от деления на длину списка, чтобы когда твой итератор уйдёт за пределы списка, индекс перешёл в начало списка.

Не знаю, зачем тебе решение, если тебе (наверное) хочется подумать головой, но вот:

def f(a):
    b = len(a) // 2
    c = []
    for i in range(len(a)):
        idx = (i + b) % len(a)
        c.append(a[idx])
    return c


P.S. Первый вариант — pythonic way. Второй — колхоз way
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@yahabrovec
Второе это по факту ваш массив но перевернутый
Т.е. последнее значение списка a[-1] "пролетает". На выводе должно быть что-то похожее:
8,1,5,3, 4,6,7
или
1,5,3, 4,6,7,8

Я насчет решения. Можно добавить условие типа
if b / 10 != 0: # тоесть массив нечетный
      z = b/2 # делим список пополам
      result = [] # переменная для записи результата
      while z >= 0: # перебор значений массива от середины до начала
           result.append(a[z]) # добавление каждого значения
           z -= 1
           if not z: # если z вышел за пределы размера массива
             z = b/2 # то мы его обнуляем
      while z < b:
           result.append(a[z]) # добавление всех значений после массива
           z+=1
result.append(a[-1]) # добавление в конец последнее значение массива
print(result)

Код немного халтурен и прийдеться немного попрыгать с бубном , но думаю смысл я донес.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы