Spe*_*er5 5 python python-2.x python-3.x
鉴于python的禅,为什么zip(*)用于解压而不是一些名为unzip()的函数?例如Transpose/Unzip Function(zip的反转)?显示如何解压缩列表.
>>> zip(*[('a', 1), ('b', 2), ('c', 3), ('d', 4)])
[('a', 'b', 'c', 'd'), (1, 2, 3, 4)]
Run Code Online (Sandbox Code Playgroud)
怎么样:
然后
>>> unzip([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
Run Code Online (Sandbox Code Playgroud)
?
我在这里错过了什么?
当你这样做时,你实际上并没有解压缩zip(*your_list).你还在拉链.
zip是一个可以根据需要使用尽可能多的参数的函数.在你的情况,你基本上是有要压缩四个不同的序列:('a', 1),('b', 2),('c', 3)和('d', 4).因此,你想这样调用zip:
>>> zip(('a', 1), ('b', 2), ('c', 3), ('d', 4))
[('a', 'b', 'c', 'd'), (1, 2, 3, 4)]
Run Code Online (Sandbox Code Playgroud)
但是你的序列不在单独的变量中,你只需要一个包含它们的列表.这是*操作符进入的位置.此运算符以列表的每个元素成为函数参数的方式解压缩列表.
这意味着当你这样做时:
your_list = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
zip(*your_list)
Run Code Online (Sandbox Code Playgroud)
Python将zip列表中每个元素作为参数调用,如下所示:
zip(('a', 1), ('b', 2), ('c', 3), ('d', 4))
Run Code Online (Sandbox Code Playgroud)
这就是为什么unzip不需要一个功能的原因:解压缩只是另一种拉链,只需要zip功能和*操作员就可以轻松实现.