Python

Помогите разобрать "прочитать" код. Объяснить алгоритм, как от работает

А теперь хорошо бы передавать списки отсортированные по длине – len(a) > (b) – проще простого - воспользуемся функцией sorted :

sorted([a, b], key=lambda x: len(x), reverse=True)
фунция sorted принимает список значений ([a,b] = [[1,2],[2,4,5]]) и сортирует по ключу key – который у нас задан функцией len(x) - возвращающей длину списка, сортируем в порядке убывания (reverse=True)

В конечном итоге вся операция записывается таким образом :

map(lambda x, y: x * (y if y is not None else 1), *sorted([a, b], key=lambda x: len(x), reverse=True))
в попытке разобрать плохой код только плохому и научитесь.

я так думаю, человек хотел сделать что-то вроде
import operator
map(operator.mul, a, b)

при этом почему-то думал, что map продолжает работать, когда меньшая из последовательностей заканчивается и возвращает на отсутствующие элементы None
поэтому, напихал таких костылей что у меня глаза закровоточили.

то же самое можно сделать списковым включением (в случае map больше подойдет генераторное)
(x * y for x, y in zip(a, b))

если все же интересен полет фантазии
для начала упростим
tmp = sorted([a, b], key=lambda x: len(x), reverse=True)
map(lambda x, y: x * (y if y is not None else 1), *tmp)
т. е. находим больший и меньший под длине массивы и передаем их как отдельные аргументы для map с помощью оператора *

так как массива всего 2 проще записать как
a, b = sorted([a, b], key=lambda x: len(x), reverse=True)
map(lambda x, y: x * (y if y is not None else 1), a, b)

или еще проще
a = max(a, b, key=len) # максимальный из a и b по длине
b = min(a, b, key=len) # минимальный из a и b по длине
map(lambda x, y: x * (y if y is not None else 1), a, b)
теперь кульминация. map берет по одному элементу из a и b, и передает их в анонимную функцию в качестве аргументов x и y
анонимная перемножает первый элемент со вторым, если второй не None, иначе просто возвращает первый.
в результате получится генератор, который попарно перемножает элементы двух последовательностей

опять же, стоит заметить, когда меньшая из последовательностей заканчивается - map остановится. проверка на None нужна только если правда None может быть элементом одной из последовательностей. но почему тогда проверяется только меньшая из них?
Макс Ломов
Макс Ломов
7 029
Лучший ответ
Рифхат Оразымбетов Доброй ночи)
Не могли бы вы зайти сюда? Самый волнующий вопрос
https://otvet.mail.ru/question/208317349
Рифхат Оразымбетов Понял только, что она удобна в таком случае:
exec('a=1\nb=2\nprint(a+b)')
Обратил внимание на то, что оптимизация у такого способа лучше. Но все же, в чем смысл функции?
Макс Ломов глупость написал по поводу
a = max(a, b, key=len) # максимальный из a и b по длине
b = min(a, b, key=len) # минимальный из a и b по длине
один из списков может переписаться, так нельзя само собой.

либо a, b = max(a, b, key=len), min(a, b, key=len)
либо a, b = (a, b) if len(a) > len(b) else (b, a)
либо if len(a) > len(b): a, b = b, a
Какая именно часть непонятна то?
N N
N N
10 115
Рифхат Оразымбетов Всё, что в дополнениях прилепил.
2 строки кода. Значение a, b так же, в дополнения, над этими 2-мя строками.
Рифхат Оразымбетов Сам алгоритм работы, каждый шаг в работе строки