转置/解压缩功能(zip的反函数)?
时间:2020-03-05 18:41:23 来源:igfitidea点击:
我有一个2项元组的列表,我想将它们转换为2个列表,其中第一个包含每个元组中的第一项,第二个包含第二项。
例如:
original = [('a', 1), ('b', 2), ('c', 3), ('d', 4)] # and I want to become... result = (['a', 'b', 'c', 'd'], [1, 2, 3, 4])
有内置的功能吗?
解决方案
回答
zip是它自己的逆函数!前提是我们使用特殊的*运算符。
>>> zip(*[('a', 1), ('b', 2), ('c', 3), ('d', 4)]) [('a', 'b', 'c', 'd'), (1, 2, 3, 4)]
它的工作方式是通过使用参数调用zip
:
zip(('a', 1), ('b', 2), ('c', 3), ('d', 4))
除了参数直接传递给zip后(在转换为元组之后),因此无需担心参数的数量太大。
回答
你也可以
result = ([ a for a,b in original ], [ b for a,b in original ])
它应该更好地扩展。特别是如果Python除非需要,否则最好不要扩展列表推导。
(顺便说一句,它创建一个2元组(对)列表,而不是像zip
那样组成一个元组列表。)
如果可以使用生成器而不是实际列表,则可以这样做:
result = (( a for a,b in original ), ( b for a,b in original ))
生成器在我们请求每个元素之前不会仔细检查列表,但另一方面,它们会保留对原始列表的引用。