Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 21, 2010 16:00:55

appetito
От:
Зарегистрирован: 2010-09-28
Сообщения: 147
Репутация: +  2  -
Профиль   Отправить e-mail  

Функции высших порядков

Ferroman
Реализация map вроде бы верная, но что-то точно работает не как ожидается, так как 1+5+8 на самом деле не равняется 15.
описАлся я:):
1     2     3
4 5 6
7 8 9
--------------
12 15 18



Отредактировано (Окт. 21, 2010 16:02:06)

Офлайн

#2 Окт. 21, 2010 20:56:34

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Функции высших порядков

>>> def mmap(f, *args):
... return [f(*t) for t in zip(*args)]
...
>>> mmap(lambda x,y,z:x+y+z, [1, 4, 7], [2, 5, 8], [3, 5, 9])
[6, 14, 24]
Да нет, 1+4+7 никак не 6, точнов вам говорю. Судя по всему, ошибка в том, что лямбда суммирует не содержимое списка, а количество элементов этого списка.

Офлайн

#3 Окт. 21, 2010 21:16:13

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Функции высших порядков

>>> def mmap(f, *args):
... return [f(*t) for t in zip(*args)]
...
>>> mmap(lambda x,y,z:x+y+z, [1, 4, 7], [2, 5, 8], [3, 5, 9])
[6, 14, 24]
>>> map(lambda x,y,z:x+y+z, [1, 4, 7], [2, 5, 8], [3, 5, 9])
[6, 14, 24]
суммирование не содержимого списка, а поэлементно их каждого списка. Разве не так должно быть?



Офлайн

#4 Окт. 21, 2010 21:50:18

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Функции высших порядков

Да нет всё правильно, я просто почему-то решил, что вы пытаетесь суммировать элементы каждого списка отдельно и сформировать список с результатами. Надо быть внимательнее.

Офлайн

#5 Окт. 21, 2010 22:03:12

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Функции высших порядков

Ferroman
спать надо б лечь :) и высыпаться больше

Офлайн

#6 Окт. 22, 2010 00:55:23

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Функции высших порядков

Есть такое.

Офлайн

#7 Окт. 23, 2010 22:52:28

AmF
От:
Зарегистрирован: 2010-09-16
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Функции высших порядков

Ferroman
sypper-pit
sp3
appetito

Огромное Спасибо за помощь!

А если теперь map написать через лямбда, то будет так?

map = lambda f, *args: (f(*t) for t in zip(*args))
Спасибо!



Отредактировано (Окт. 23, 2010 22:55:12)

Офлайн

#8 Окт. 24, 2010 12:19:19

appetito
От:
Зарегистрирован: 2010-09-28
Сообщения: 147
Репутация: +  2  -
Профиль   Отправить e-mail  

Функции высших порядков

map = lambda f, *args: (f(*t) for t in zip(*args))
такая функция вернет генератор, чтобы вернула список, надо использовать квадратные скобки:

map = lambda f, *args: [(*t) for t in zip(*args)]



Офлайн

#9 Окт. 24, 2010 15:24:13

AmF
От:
Зарегистрирован: 2010-09-16
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Функции высших порядков

такая функция вернет генератор, чтобы вернула список, надо использовать квадратные скобки:

map = lambda f, *args: [(*t) for t in zip(*args)]
Ну да-да … это мой баг …

Еще такой вопрос: max(ls) - что-то с ней у меня криво всё выходит … Может, кто подскажет, как ее оформить?
И, может, несложно будет глянуть на мою реализацию filter(func, ls) - тру или нет:

def filt(func, ls):
if func:
return [i for i in ls if func(i)]

else:
return [i for i in ls if i]
filt = lambda func, ls: [i for i in ls if func(i)] if func else [i for i in ls if i]
Спасибо.



Отредактировано (Окт. 24, 2010 15:26:38)

Офлайн

#10 Окт. 24, 2010 22:03:46

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Функции высших порядков

AmF
Если код работает так кк надо тебе , это уже тру :)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version