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