Как применить некоторую операцию к каждому элементу кортежа

#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))