在python中总结元组?

时间:2013-11-22 05:17:29

标签: python python-2.7 tuples list-comprehension

pt1pt2是由{int}组成的两个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)怎么会导致错误呢?它似乎是tuplebtuple

2 个答案:

答案 0 :(得分:2)

您了解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
>>> 

答案 1 :(得分:0)

对应该是元组列表。

a,b应该一次解开那些元组。所以他们应该是标量。

关于列表推导和生成器表达式有很多相似之处。我不喜欢他们的一件事是,当你对他们的行为方式有疑问时,你最终会把它们重写为循环。

但我的确建议将你的理解重写为循环,并插入打印(a,b)或打印a,b。这可能有所帮助。