Python переупорядочивает отсортированный список, чтобы наибольшее значение было в середине

Мне нужно переупорядочить отсортированный список, чтобы «средний» элемент был наибольшим числом. Числа, ведущие к середине, возрастают, числа после середины идут в порядке убывания.

У меня есть следующее рабочее решение, но есть ощущение, что его можно сделать проще:

foo = range(7)
bar = [n for i, n in enumerate(foo) if n % 2 == len(foo) % 2]
bar += [n for n in reversed(foo) if n not in bar]
bar
[1, 3, 5, 6, 4, 2, 0]

person jaap3    schedule 07.05.2012    source источник
comment
Каков вариант использования для этого?   -  person Daenyth    schedule 07.05.2012
comment
Список будет отображаться горизонтально (и не будет содержать цифр). Визуально имеет смысл поместить наибольшее число в середину и спуститься туда наружу...   -  person jaap3    schedule 07.05.2012


Ответы (2)


как насчет:

foo[len(foo)%2::2] + foo[::-2]

In [1]: foo = range(7)
In [2]: foo[len(foo)%2::2] + foo[::-2]
Out[2]: [1, 3, 5, 6, 4, 2, 0]
In [3]: foo = range(8)
In [4]: foo[len(foo)%2::2] + foo[::-2]
Out[4]: [0, 2, 4, 6, 7, 5, 3, 1]
person HYRY    schedule 07.05.2012
comment
Это довольно круто и отлично работает для моего варианта использования. Я всегда забываю о синтаксисе расширенного фрагмента - person jaap3; 07.05.2012

Используйте нарезку с шагом 2 вверх и -2 назад:

>>> foo[1::2]+foo[-1::-2]
[1, 3, 5, 6, 4, 2, 0]
person PaulMcG    schedule 07.05.2012
comment
Стоит отметить, что список должен быть отсортирован в первую очередь. Так что foo.sort() тогда это, если вы не знаете, что это отсортировано. - person Gareth Latty; 07.05.2012