#python #python_3x #функции #функциональное_программирование
Нужно решить задачу полностью в функциональном стиле, т.е. в одну строку, без циклов (совсем нельзя использовать for) и без присваиваний. Задача требует сначала ввести число n, затем вводится n последовательностей. К ним нужно применить функцию zip (дальше не важно, к вопросу не относится). Написал такой код: print(*zip(map(lambda x: list(map(int, input().split())), range(int(input()))))) До применения zip всё правильно, но в zip, кажется, последовательности передаются по одной, так что, на практике выходит так: Ввод: 2 0 0 1 1 Правильный вывод: (0, 1) (0, 1) Действительный вывод: ([0, 0],) ([1, 1],) Как сделать правильно, и чтобы при этом оставаться в функциональной парадигме?
Ответы
Ответ 1
Добавив к вашему решению одну звездочку можно получить необходимый результат: print(*zip(*map(lambda x: list(map(int, input().split())), range(int(input()))))) # ^ <--- NOTE вывод: (0, 1) (0, 1) пояснение на примере: In [159]: list(zip([[0, 0], [1,1]])) Out[159]: [([0, 0],), ([1, 1],)] # то что получилось In [160]: list(zip([0, 0], [1,1])) Out[160]: [(0, 1), (0, 1)] # то что нужно получить In [161]: list(zip(*[[0, 0], [1,1]])) # решение Out[161]: [(0, 1), (0, 1)] PS Что значит * (звёздочка) и ** двойная звёздочка в Питоне? Функция zip(*iterables) принимает ноль и более позиционных аргументов и разница в вызове zip(lst) и zip(*lst) в том как будут обрабатываться переданные аргументы: при вызове: zip(lst) - передается один аргумент типа list при вызове: zip(*lst) - передается все содержимое списка как отдельные позиционные аргументы Пример с функцией print(): In [105]: lst = [1,2,3] In [106]: print(lst) [1, 2, 3] In [107]: print(*lst) 1 2 3 тот же результат мы получим передав три раздельных параметра: In [108]: print(1,2,3) 1 2 3
Комментариев нет:
Отправить комментарий