【问题标题】:How can I pairwise sum two equal-length tuples [duplicate]如何对两个等长的元组进行成对求和[重复]
【发布时间】:2010-09-27 10:01:28
【问题描述】:

如何获得两个等长元组的成对和?例如,如果我有 (0,-1,7) 和 (3,4,-7) 我希望有 (3,3,0) 作为答案。

【问题讨论】:

  • 一年半前提出的一个问题的副本似乎没有得到任何好的答案。其中的所有答案都是基于地图的,这比列表理解/生成表达式(如下)要干净得多。公认的答案要糟糕得多——重写一个类只是为了对其执行一个方法根本没有意义。
  • 我认为接受答案的原因是因为这是问题所要求的特别奇怪的行为,所以这不是回答者的错。

标签: python tuples


【解决方案1】:
tuple(map(lambda (x, y): x + y, zip((0,-1,7), (3,4,-7))))

如果您希望避免使用maplambda,那么您可以这样做:

tuple(x + y for x,y in zip((0,-1,7), (3,4,-7)))

编辑:正如其中一个答案指出的那样,您可以使用 sum 而不是显式拆分 zip 返回的元组。因此,您可以重写上面的代码示例,如下所示:

tuple(sum(t) for t in zip((0,-1,7), (3,4,-7)))

参考:zipmapsum

【讨论】:

  • 列表理解通常更可取。这比 #497885 中的所有功能答案更直观。
  • @Glenn:同意。也就是说,我发现首先考虑映射和过滤器然后将其映射(不是双关语:P)更容易理解列表。
  • 我正好相反:列表推导式(在这种情况下,实际上是生成器表达式)对我来说自然是直观的,但我必须考虑 map——可能是因为它的使用频率要低得多在 Python 中。
【解决方案2】:

使用 sum():

>>> tuple(sum(pair) for pair in zip((0,-1,7), (3,4,-7)))

>>> tuple(map(sum, zip((0,-1,7), (3,4,-7))))

【讨论】:

  • tuple(map(operator.add, (0, -1, 7), (3, 4, -7)))
  • @Mr_and_Mrs_D +1, operator.add 比使用 mapzip 快大约 2.2 倍
【解决方案3】:
>>> t1 = (0,-1,7)
>>> t2 = (3,4,-7)
>>> tuple(i + j for i, j in zip(t1, t2))
(3, 3, 0)

【讨论】:

    【解决方案4】:

    或者(如果你有非常大的元组或者你打算用它们做其他数学运算,那很好):

    > import numpy as np
    > t1 = (0, -1, 7)
    > t2 = (3, 4, -7)
    > at1 = np.array(t1)
    > at2 = np.array(t2)
    > tuple(at1 + at2)
    (3, 3, 0)
    

    缺点:需要更多的数据准备。在大多数情况下可能有点矫枉过正。

    优点:操作非常明确和孤立。使用大元组可能非常快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      相关资源
      最近更新 更多