【问题标题】:Please explain a python zip and unpacking solution [duplicate]请解释一个python zip和解包解决方案[重复]
【发布时间】:2013-03-29 15:22:52
【问题描述】:

这里是 Python 3 学习者:

question 接受了以下答案:

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

返回两个元组。如果有人能分解答案并解释它对 Python 3 的作用,我将不胜感激(我知道range() 在 Python 3 中返回一个迭代器)。我了解列表推导,但我对解包感到困惑(我认为您只能使用星号表达式作为分配目标的一部分)。

我同样对下面的代码感到困惑。我理解结果和压缩(或认为我知道),但星号表达式再次让我失望。

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

来自this

>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> zipped = zip(x, y)
>>> list(zipped)
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zip(x, y))
>>> x == list(x2) and y == list(y2)
True

【问题讨论】:

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


    【解决方案1】:

    *expressionargument unpacking 应用于函数调用。它采用expression 部分, 将其解析为可迭代对象,并使该可迭代对象中的每个元素成为函数的单独参数。

    所以,zip(x, y) 返回一个迭代器(它是一个可迭代的),并且该迭代器中的每个元素都作为 outer 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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      相关资源
      最近更新 更多