如何将一个元组列表解压为单独的列表?
如何将一个元组列表解压为单独的列表?
我有一个元组列表 l = [(1,2), (3,4), (8,9)]
。如何简洁地使用Python将此列表解压为两个独立的列表,以获得 [ [1, 3, 8], [2, 4, 9] ]
?\n换句话说,我如何获得zip
的反函数?
问题出现的原因:
该问题的出现是因为需要将一个包含多个元组的列表解压成多个单独的列表。
解决方法:
可以使用列表推导式或者zip函数来解决该问题。如果想要得到一个列表的列表,可以使用列表推导式 [list(t) for t in zip(*l)]。如果允许得到一个元组的列表,可以直接使用zip(*l)。
代码如下:
# 列表推导式 [list(t) for t in zip(*l)] # zip函数 zip(*l)
其他相关讨论中也提到了使用map函数的方法,但是在Python 2.x中,使用map函数会比列表推导式慢。
讨论中还提到了一些关于列表推导式和map函数速度比较的结果,不同的问题可能会导致不同的结果,但是列表推导式在Python 2.x和Python 3.x中都能使用。
最后还有一条讨论提到,如果列表本身是一个元组,也可以使用上述方法进行解压。
通过使用列表推导式或者zip函数,可以将一个包含多个元组的列表解压成多个单独的列表。
如何将一个元组列表解压成单独的列表?
问题出现的原因是希望将一个包含元组的列表解压成单独的列表,以便对每个元组中的元素进行操作。
解决方法是使用zip(*list)
。这个函数将所有输入的元素配对,从第一个值开始,然后是第二个值,依此类推。通过使用*l
,可以将l
中的所有元组作为单独的参数应用于zip()
函数,从而使zip()
将1
与3
与8
配对,然后是2
与4
和9
。这些与列或l
的转置相对应。
zip()
生成元组;如果需要可变的列表对象,可以将元组映射为列表或使用列表推导生成列表的列表。例如,map(list, zip(*l))
将元组映射为列表,而[list(t) for t in zip(*l)]
则使用列表推导生成列表的列表。
此外,可以创建一个名为transpose()
的函数,将上述操作封装起来,这样代码就更易读了。
需要注意的是,a, b = zip(*list)
在list
为空时会失败,因此需要将空作为特殊情况处理。可以使用列表推导或异常处理来解决这个问题。
如果希望得到列表而不是元组,可以将元组映射为列表。对于大多数情况,生成序列或迭代器已经足够了。
如果l
是一个非常长的列表,可以直接迭代zip(*long_list)
,而不是使用list(zip(*long_list))
来节省内存。
如果有嵌套的(x, y)对列表,并且希望将它们分解成x和y的列表的列表,可以对每个嵌套列表使用上述过程的迭代。例如,x, y = zip(*[ zip(*[ (x, y) for a in range(3) ]) for b in range(5)])
。