А теперь хорошо бы передавать списки отсортированные по длине – 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))
Python
Помогите разобрать "прочитать" код. Объяснить алгоритм, как от работает
в попытке разобрать плохой код только плохому и научитесь.
я так думаю, человек хотел сделать что-то вроде
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 может быть элементом одной из последовательностей. но почему тогда проверяется только меньшая из них?
я так думаю, человек хотел сделать что-то вроде
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 может быть элементом одной из последовательностей. но почему тогда проверяется только меньшая из них?
Какая именно часть непонятна то?
Рифхат Оразымбетов
Всё, что в дополнениях прилепил.
2 строки кода. Значение a, b так же, в дополнения, над этими 2-мя строками.
2 строки кода. Значение a, b так же, в дополнения, над этими 2-мя строками.
Рифхат Оразымбетов
Сам алгоритм работы, каждый шаг в работе строки
Похожие вопросы
- Не понимаю как выявить у кода (алгоритма ) сложность кто поможет с решением и объяснит как получил (выявил) Python
- Помогите написать программу на Python, моя версия кода на скрине, вроде всё работает, но автопроверка не проходит.
- Помогите пожалуйста переделать код на Питоне
- Помогите пожалуйста написать код
- Как возвести число в степень в python через цикл while? В чем моя ошибка в коде? Объясните, пожалуйста подробнее
- Python. Помогите пожалуйста с кодом
- Помогите пожалуйста с кодом. Python
- Python помогите правильнее написать код.
- Добрый день, помогите, пожалуйста, написать код к задаче на питоне
- Объясните что делает как работает и зачем нужна команда return?
Не могли бы вы зайти сюда? Самый волнующий вопрос
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