2016-09-22 342 views
2

对于我的申请unitserrors始终是数值的列表。我试着用google搜索每个部分,并找出zip的第一部分。这似乎代码zip(* sorted(zip(units,errors)))的作用是什么?

ziped_list = zip(units, errors) 

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

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

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

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

最后一位拆包,然后拉链仍然一个谜,我一直无法弄清楚他们做了什么。据我所知,*解开位置参数,但做*不让我看到它在做什么,如果我在命令行尝试它。令我更加困惑的是,为什么zip需要作为参数传递给一个解压缩列表,如*sorted,如果它已将一个名为iterable的变量作为参数zip(*iterable)。这似乎令人困惑(对我来说)为什么我们需要解压缩一些只能作为输入列表的迭代器。

+1

元组的比较就像所描述的那样是字典式的,而不仅仅是第一个元素。试试'(1,1)','(1,2)','(2,1)'和'(2,2)'来看看它是如何工作的。 –

+0

@DietrichEpp也许我不明白词典上的意思。 – Pinocchio

+0

aka“按字母顺序排列” –

回答

3

如果你没有解压缩列表,然后传递给参数作为一个元素,所以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

似乎你已经知道zip的功能。

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

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

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

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

相关问题