【问题标题】:Adding two tuples and applying a function to each element添加两个元组并对每个元素应用一个函数
【发布时间】:2016-12-10 16:36:09
【问题描述】:

我想将一个元组(称为指针)添加到另一个元组,然后将我创建的钳位函数应用到它的每个元素,最后返回新的元组。 我确信有更好的方法来做到这一点:

from operator import add

pointer = (1, 1)
tuple2 = (1, 5)

pointer = map(add, pointer, tuple2)
x, y = pointer
x, y = clamp(x, 0, 3), clamp(y, 0, 3) # min = 0, max = 3
pointer = (x, y)

[OUTPUT] 指针:(2, 3)

【问题讨论】:

  • 添加在地图中的作用是什么?
  • 提供完整代码并在此处提问:codereview.stackexchange.com
  • 我更新了代码以包含导入,它将元组的元素添加在一起。

标签: python tuples


【解决方案1】:

一种方法是使用functools.partial 创建具有混合限制的钳位函数,然后将其映射到添加操作后获得的地图对象上。

from operator import add
from functools import partial

def clamp(x, lo, hi):
    return max(lo, min(x, hi)) 

pointer = (1, 1)
tuple2 = (1, 5)
pointer = tuple(map(partial(clamp, lo=0, hi=3), map(add, pointer, tuple2)))
print(pointer)

输出

(2, 3)

另一种方法是将加法和钳制合并到一个函数中。在下面的代码中,我使用了一个函数 make_add_clamp,它返回一个函数,该函数使用传递给 make_add_clamp 的限制进行添加和钳制。

from operator import add

def clamp(x, lo, hi):
    return max(lo, min(x, hi)) 

def make_add_clamp(lo, hi):
    def func(x, y):
        return clamp(x + y, lo, hi)
    return func

pointer = (1, 1)
tuple2 = (1, 5)

pointer = tuple(map(make_add_clamp(0, 3), pointer, tuple2))
print(pointer)

【讨论】:

    【解决方案2】:

    您可以部分手动申请clamp

    >>> def clamp(a, m, M):
    ...   return min(max(a, m),M)
    ...
    >>> clamp(2, 0, 3)
    2
    >>> clamp(6, 0, 3)
    3
    

    所以定义一个新函数...

    >>> def clamp_partial(n):
    ...   return clamp(n,0,3)
    ...
    

    最后

    >>> tuple(map(clamp_partial, map(add, pointer, tuple2)))
    (2, 3)
    >>>
    

    不过,有些人发现推导式/生成器表达式更具可读性。并且不需要定义新的函数。

    >>> pointer = (1, 1)
    >>> tuple2 = (1, 5)
    >>> pointer = (t1 + t2 for t1, t2 in zip(pointer, tuple2))
    >>> pointer
    <generator object <genexpr> at 0x10218a780>
    >>> pointer = tuple(clamp(p, 0, 3) for p in pointer)
    >>> pointer
    (2, 3)
    >>>
    

    【讨论】:

      【解决方案3】:

      你可以使用 itertools.chain,itertools.chain() 方法可以用来简化这个任务。它将一个可迭代列表作为输入,并返回一个迭代器,该迭代器有效地掩盖了您实际上是在多个容器上操作的事实。为了说明,请考虑以下示例:

      >>>from itertools import chain
      >>>a = [1, 2, 3, 4]
      >>>b = ['x', 'y', 'z']
      >>>for x in chain(a, b):
      ...
       print(x)
      ...
      1
      2
      3
      4
      x
      y
      z
      

      【讨论】:

      • 在当前状态下,您的答案并未解决 OP 的问题。您应该展示如何将chain 应用于 OP 的问题。
      猜你喜欢
      • 2021-03-20
      • 2018-01-04
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 2022-01-10
      • 1970-01-01
      相关资源
      最近更新 更多