代码zip(*排序(zip(单位,错误)))有什么作用?

时间:2016-09-22 02:21:38

标签: python

对于我的应用unitserrors始终是数值列表。我试着用Google搜索每个部分的功能,并找出了zip的第一部分。似乎

   ziped_list = zip(units, errors)

简单地将单位和错误配对以生成列表[...,(unit, error),...]。然后它传递给sort对元素进行排序。由于我没有提供key的参数,因此它直接比较了元素,如文档所示:

  

默认值为None(直接比较元素)。

由于ziped_list是整数元组的列表,因此它似乎直接在元组之间进行比较。从我的终端(python 3)中的一个小例子看来,它基于第一个元素进行比较(即使文档暗示比较是元素明智的):

>>> (1,None) < (2,None)
True
>>> (2,None) < (1,None)
False

最后一点拆包然后拉链仍然是一个谜,我无法弄清楚他们做了什么。我理解*解压缩到位置参数,但是如果我在命令行中尝试它,那么*不能让我看到它正在做什么。更让我感到困惑的是,为什么zip需要作为参数传递一个解压缩列表,例如*sorted,如果它已经将一个名为iterable的变量作为参数zip(*iterable)。对我来说,为什么我们需要解压缩一些只允许作为输入的迭代列表的东西似乎令人困惑。

2 个答案:

答案 0 :(得分:4)

如果不解压缩列表,则将参数作为一个元素传递给参数,因此zip不能聚合每个迭代的元素。 例如:

a = [3, 2, 1,]
b = ['a', 'b', 'c']
ret = zip(a, b)
the_list = sorted(ret)  
the_list >> [(1, 'c'), (2, 'b'), (3, 'a')]

zip(*the_list)等于zip((1, 'c'), (2, 'b'), (3, 'a'))

输出:[(1, 2, 3), ('c', 'b', 'a')]

如果您只使用zip(the_list)等于zip([(1, 'c'), (2, 'b'), (3, 'a')],)

输出:[((1, 'c'),), ((2, 'b'),), ((3, 'a'),)]

您还可以看到What does ** (double star) and * (star) do for Python parameters?

答案 1 :(得分:1)

似乎你已经弄明白了zip的作用。

对压缩列表进行排序时,sorted会比较每个元组的第一个元素,并对列表进行排序。如果第一个元素相等,则顺序由第二个元素确定。

*运算符然后解压缩排序列表。

最后,第二个zip重新组合输出。

所以你最终得到的是两个元组列表。第一个列表是错误,从最小到最大排序。第二个列表是相应的错误。