Страницы

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

вторник, 6 ноября 2018 г.

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

Нужно решить задачу полностью в функциональном стиле, т.е. в одну строку, без циклов (совсем нельзя использовать 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],)
Как сделать правильно, и чтобы при этом оставаться в функциональной парадигме?


Ответ

Добавив к вашему решению одну звездочку можно получить необходимый результат:
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

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

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