#python #tuples
Вопрос:
У меня есть кортеж, подобный (p1, p2)
(например, (5,3) или (2,1)) Я хочу применить ту же операцию к каждому элементу кортежа. (Кстати, эта операция даст для каждого элемента еще один кортеж, так что у меня будет кортеж кортежей, но это не является необходимым условием)
Сначала я подумал что-то вроде
for element in (3,2): res=function(element)
но, во-первых, это не кажется элегантным решением, а во-вторых, мне все равно придется сформировать кортеж из каждого res
, чтобы получить (function(3),function(2))
решение
Как я могу применить функцию (с несколькими аргументами) к каждому элементу кортежа один раз и получить кортеж возвращаемых значений?
Ответ №1:
Если я правильно понял ваш вопрос, map
следует также приступить к работе:
tuple(map(func, tpl))
где func
указана функция с одним аргументом, которую вы определили.
Теперь, если у вас есть функция с несколькими аргументами, которые вы хотели бы применить к каждому элементу, например:
def func(x, y, z): return x*y z
Я предполагаю, что 2 элемента (возьмем y и z) являются фиксированными, в то время как x будет определяться значением в кортеже. На мой взгляд, есть два подхода:
- Либо вы определяете новую функцию с 2 фиксированными аргументами и
map
:def func1(x): return func(x, 3, 2) tuple(map(func1, tpl))
- Или карта следующим образом (я думаю, что она менее элегантна, но, возможно, это вопрос вкуса):
tuple(map(lambda x: func(x, 3, 2), tpl))
Ответ №2:
Один из подходов использует понимание списка:
def add_one(x): return x 1 tpl = (5, 3) output = tuple([add_one(x) for x in tpl]) print(output) # (6, 4)
Ответ №3:
Вы можете рассмотреть возможность использования понимания генератора, а затем преобразовать его в кортеж:
gt;gt;gt; data = (3, 5, 7, 9) gt;gt;gt; tuple((function(x) for x in data))