Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Неверный порядок выполнения алгоритма на Python в функциональной парадигме

#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

Комментариев нет:

Отправить комментарий