Python:为什么使用zip(*)代替unzip()?

时间:2016-01-07 15:03:50

标签: python python-3.x python-2.x

鉴于zen of python为什么 zip(*)用于解压而不是名为 unzip()的函数?例如,Transpose/Unzip Function (inverse of zip)?显示了如何解压缩列表。

>>> zip(*[('a', 1), ('b', 2), ('c', 3), ('d', 4)])
[('a', 'b', 'c', 'd'), (1, 2, 3, 4)]

怎么样:

  • 美丽而丑陋
  • 显式而非隐式
  • 简单而非复杂
  • 可读

然后

>>> unzip([('a', 1), ('b', 2), ('c', 3), ('d', 4)])

我在这里缺少什么?

1 个答案:

答案 0 :(得分:5)

当您执行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)]

但是你的序列不在单独的变量中,你只需要一个包含它们的列表。这就是* operator的用武之地。这个运算符以列表中每个元素成为函数参数的方式解包列表。

这意味着当你这样做时:

your_list = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
zip(*your_list)

Python调用zip将列表中的每个元素作为参数,如下所示:

zip(('a', 1), ('b', 2), ('c', 3), ('d', 4))

这就是为什么unzip函数不是必需的原因:解压缩只是另一种拉链,只需zip函数和*运算符即可轻松实现。