请解释python zip和解包解决方案

时间:2013-03-29 15:22:52

标签: python python-3.x iterable-unpacking

Python 3学习者:

question有以下接受的答案:

rr,tt = zip(*[(i*10, i*12) for i in xrange(4)])

返回两个元组。如果有人可以打破答案并解释它在Python 3中做了什么(我知道{3}在Python 3中返回迭代器),我将不胜感激。我理解列表理解但是我对解压缩感到困惑(我认为你只能使用星号表达式作为赋值目标的一部分)。

我同样对以下代码感到困惑。我理解结果和拉链(或者我认为)但是星号表达再一次让我击败了。

range()

来自this

x2, y2 = zip(*zip(x, y))

1 个答案:

答案 0 :(得分:5)

*expressionargument unpacking应用于函数调用。需要expression部分,具有来解析序列,并使该序列中的每个元素成为函数的单独参数。

因此,zip(x, y)返回一个序列,该序列中的每个元素都成为外部 zip()函数的参数。

zip(*[(i*10, i*12) for i in xrange(4)])来说,它可能更清晰一些;这里有几个要素:

  • [(i*10, i*12) for i in xrange(4)] (在python 3中应为range()创建一个包含4个元组的列表,[(0, 0), (10, 12), (20, 24), (30, 36)]
  • zip(*...)部分然后获取这4个元组中的每一个并将其作为参数传递给zip()函数。
  • zip()获取每个元组并将其元素配对;每个元组两个元素意味着结果是2个列表,每个元素包含4个值。

因为zip()函数返回两个序列,所以可以将它们分配给两个变量。

我会发现以下是同一表达式的更易读的版本:

rr, tt = tuple(range(0, 40, 10)), tuple(range(0, 48, 12))