Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 21, 2015 15:24:44

Malcolm1988
Зарегистрирован: 2015-09-21
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Отсортировать список

Здравствуйте!
Помогите пожалуйста решить задачку.
На вход идет набор чисел, при этом данные числа нужно отсортировать:
все числа, имеющие нечетное положение в списке идут по возрастанию, а другие числа (четное положение) по убыванию!

Пример input: 1 5 7 4 3 8 6 2
output: 1 8 3 5 6 4 7 2

Я правильно понял, что можно использовать if? например,
a=input().split()
for i in range(len(a)):
if i%2==0:

Отредактировано Malcolm1988 (Сен. 21, 2015 16:29:04)

Офлайн

#2 Сен. 21, 2015 15:41:12

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Отсортировать список

Malcolm1988,
какую литературу по языку вы читали?



Офлайн

#3 Сен. 21, 2015 16:24:11

Malcolm1988
Зарегистрирован: 2015-09-21
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Отсортировать список

A Bite of Python и Лунца немного

Офлайн

#4 Сен. 21, 2015 17:17:48

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Отсортировать список

Читал обе этих книги, не могу взять в толк, какая из них научила вас так вот делать

for i in range(len(a)):
может быть вы мне покажите, где у Лутц учить так делать циклы?



Офлайн

#5 Сен. 21, 2015 22:42:26

Kon52
Зарегистрирован: 2015-01-31
Сообщения: 66
Репутация: +  3  -
Профиль   Отправить e-mail  

Отсортировать список

Malcolm1988
Я правильно понял, что можно использовать if?
Правильно, но i в приведённом вами примере должна служить индексом для элементов заданного списка.
Лутц:
>>> X = 'spam'
>>> len(X)                                                           # Длина строки
4
>>> list(range(len(X)))                                        # Все допустимые смещения в X
[0, 1, 2, 3]
>>>
>>> for i in range(len(X)): print(X[i],end=' ')       # Извлечение элементов вручную
...
s p a m

Перечитайте Лутца, глава в 4ом издании называется “Циклы while и for”.

Отредактировано Kon52 (Сен. 21, 2015 22:43:53)

Офлайн

#6 Сен. 22, 2015 05:44:40

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Отсортировать список



Офлайн

#7 Сен. 22, 2015 05:48:05

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Отсортировать список

l = [1, 5, 7, 4, 3, 8, 6, 2]
print(l[::2])
print(l[-1::-2])





Офлайн

#8 Сен. 25, 2015 01:06:40

vananabu
Зарегистрирован: 2015-07-25
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Отсортировать список

Malcolm1988
Вполне правильно думал. Только зря сразу же прибежал на форум. Лутц все доходчиво описывает. Вот код, но для списков с одним элементом выдаст ошибку. Сам додумай проверку.

l = [1, 5, 7, 4, 3, 8, 6, 2]
a = sorted(l[::2])
b = sorted(l[1::2], reverse=True)
c = [b.pop(0) if i%2 else a.pop(0) for i in range(len(l))]

Офлайн

#9 Сен. 25, 2015 05:42:51

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Отсортировать список

c = [b.pop(0) if i%2 else a.pop(0) for i in range(len(l))]

Совсем по питоньи будет зипнуть два списка, а потом этот список кортежей развернуть в один список.
Есть такой паттерн
from itertools import chain
l1 = [1, 2, 3, 4, 5]
l2 = [5, 6, 7, 34, 3]
l = zip(l1, l2)
print(l)
print(list(chain.from_iterable(l)))



Офлайн

#10 Сен. 25, 2015 09:30:11

vananabu
Зарегистрирован: 2015-07-25
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Отсортировать список

верно. не до конца докрутил решение) твой вариант больше true pythonic.

Отредактировано vananabu (Сен. 25, 2015 09:38:09)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version