DenLadon
Июнь 27, 2016 22:56:03
Привет всем!
Помогите реализовать собственную функцию max.
Главная для меня проблема, не могу как следует распаковать все аргументы принимаемые функцией для сравнения. Либо код растягивается на очень много строк, либо просто не дает возможность сравнивать аргументы между собой.
Тестил на примерах:
max(3, 2)
max(, , , )
max([, , ], key=lambda x: x)
max(x + 5 for x in range(6))
max(abs(i) for i in range(-10, 10))
max(filter(str.isalpha,“@v$e56r5CY{]”))
Огромная просьба наставить на путь истинный и лучше без готового решения.
Заранее спасибо!
terabayt
Июнь 28, 2016 02:46:39
вам нужно 3 вещи
hasattr(a[0], '__iter__')
if 'key' in b:
key = b['key']
ZerG
Июнь 28, 2016 07:38:36
правильнее будет вам почитать про *args, **kwargs в питоне!
Там как раз детально расписан ваш случай.
Rodegast
Июнь 28, 2016 10:35:28
Учись пока я жив:
# MAX
>>> reduce(lambda x,y: x if x > y else y, [0,10,5,8,100,9])
100
# MIN
>>> reduce(lambda x,y: x if x < y else y, [0,10,5,8,100,9])
0
Vigi
Июнь 28, 2016 11:58:49
так
reduce вроде как-бы не рекомендуют использовать (читаемость портится и тд и тп и бла бла бла)
Rodegast
Июнь 28, 2016 17:43:56
Vigi
так reduce вроде как-бы не рекомендуют использовать (читаемость портится и тд и тп и бла бла бла)
Конечно в реальных программах заменять функцию
max на то что я написал как-бы ненужно.
DenLadon
Июнь 28, 2016 18:43:44
На счет *args, **kwargs это понятно, что надо использовать, а теперь с помощью terabayt понятно как отделить итерируемые аргументы от неитерируемых.
Но распаковка итерируемых объектов страдает, г…код какой-то получается.
Получаются списки разной глубины вложенности при следующих случаях:
max([, , ], key=lambda x: x)
max(, , , )
На счет использования reduce. Интересно конечно, но работает когда у тебя уже создан список (а вот с этим как раз и проблема). Но и тут возникнут трудности при обработке значений по передаваемому key.
Я честно говоря выбирал max значение с помощью сортировки списка.