【问题标题】:Summing tuples in python?在python中求和元组?
【发布时间】:2013-11-22 05:17:29
【问题描述】:

pt1pt2 是两个由整数组成的 tuple

pairs = zip(pt1, pt2)  
sum_sq_diffs = sum((a - b)**2 for a, b in pairs)
return (sum_sq_diffs) 

我的问题与第二行有关。什么是a和b?如果您通过以下方式打印它们:

 print list((a,b) for a, b in pairs))

你得到 [(pt1x,pt2x), (pt1y, pt2y)]

如果我取两个元组并减去它们,你会得到一个错误。那么sum_sq_diffs = sum((a - b)**2 for a, b in pairs) 怎么不会导致错误呢?似乎 a 是 tuplebtuple

【问题讨论】:

    标签: python python-2.7 tuples list-comprehension


    【解决方案1】:

    您了解pairs 是一个元组列表。

    现在,第二行是列表推导,相当于

    sum_sq_diffs = 0
    for a, b in pairs:
        sum_sq_diffs += (a - b)**2 
    

    现在,在遍历单个元素时,python 会为你做一个“元组解包”,并将 (x, y) 分别提取到局部变量 ab

    您可以在tuple unpacking here上阅读更多内容

    这被恰当地称为元组解包。元组解包要求左侧的变量列表具有与元组长度相同的元素数。请注意,多重赋值实际上只是元组打包和元组解包的组合!

    这是一个快速演示,应该可以演示:

    >>> pt1 = [1, 2, 3]
    >>> pt2 = [4, 5, 6]
    >>> pairs = zip(pt1, pt2)  
    >>> pairs
    [(1, 4), (2, 5), (3, 6)]
    >>> sum_sq_diffs = sum((a - b)**2 for a, b in pairs)
    >>> sum_sq_diffs
    27
    >>> sum_sq_diffs_2 = 0
    >>> for a, b in pairs:
    ...     print a, b
    ...     sum_sq_diffs_2 += (a - b)**2
    ... 
    1 4
    2 5
    3 6
    >>> sum_sq_diffs_2
    27
    >>> 
    

    【讨论】:

      【解决方案2】:

      pairs 应该是一个元组列表。

      a, b 应该一次一个地解压这些元组。所以它们应该是标量。

      列表推导和生成器表达式有很多令人喜欢的地方。我不喜欢它们的一件事是,当你对它们的行为有疑问时,你往往会最终将它们重写为循环。

      但我确实建议将您的理解重写为循环,并插入 print(a,b) 或 print a, b。它可能会有所帮助。

      【讨论】:

      • a, b 可以是任何东西,而不仅仅是标量。它们是您在拆包时得到的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 2019-06-01
      • 2010-10-12
      • 1970-01-01
      • 2017-02-24
      • 2016-03-15
      相关资源
      最近更新 更多