如何在Python中压缩列表的列表(附代码)

101 阅读2分钟

python zip()方法返回一个zip对象,一个图元的迭代器,其中每个传递的迭代器中的第一个元素被配对在一起。然后每个给定的迭代器中的第二个元素被配对在一起,第三个元素,等等。

Python 列表的 zip 列表

创建一个Python zip 列表列表,定义三个具有相同元素数量的不同列表,并将这些列表传递给 zip() 方法,该方法将返回元组迭代器,然后使用list()方法将其转换成列表:

# app.py

stocks = ['reliance', 'infosys', 'tcs']
prices = [2175, 1127, 2750]
sectors = ['Oil and Telecom', 'IT', 'IT']

zipped = zip(stocks, prices, sectors)

print(list(zipped))

输出

[('reliance', 2175, 'Oil and Telecom'), ('infosys', 1127, 'IT'), ('tcs', 2750, 'IT')]

你可以看到,它与每个列表的第一项配对,然后是第二和第三项。我们可以使用 zip() 方法将列表合并。

解除参数的包装

当参数已经在一个列表元组中,但必须为一个需要单独位置参数的函数调用解包时,就会出现相反的情况。

例如,内置的range()函数希望有单独的startstop参数。如果它们不能单独使用,就用***-操作符**编写函数调用,将参数从一个列表或元组中解压:

# app.py

rdata = list(range(2, 8))
print(rdata)

args = [2, 8]
op = list(range(*args))
print(op)

输出

[2, 3, 4, 5, 6, 7]
[2, 3, 4, 5, 6, 7]

还有一个例子是在一个列表中压缩列表:

# app.py

x = [1, 2]
y = [11, 22]
z = [111, 222]

op = zip(*[x, y, z])
print(list(op))

输出

[(1, 11, 111), (2, 22, 222)]

压缩两个列表的列表

到目前为止,我们已经压缩了列表的列表。现在,我们将对两个列表的列表进行压缩。标准的 zip() 方法使我们有能力聚合容器中的值。

但是有时候,我们有一个用例,我们需要有多个列表,并且包含列表作为索引元素,我们需要将它们合并/压缩在一起。这是很不常见的情况,但解决方案仍然可以很简单。

要在 Python 中压缩两个列表,可以使用itertools.chain() + zip()方法的组合:

# app.py

import itertools

listA = [[2, 4], [6, 8], [10, 12]]
listB = [[1, 3], [5, 7], [9, 11]]

op = [list(itertools.chain(*i))
      for i in zip(listA, listB)]

print(list(op))

输出

[[2, 4, 1, 3], [6, 8, 5, 7], [10, 12, 9, 11]]

这个itertools.chain()zip()函数的组合可以完成这个特殊的工作。chain()函数可以进行列表间的聚合,而最终的聚合是由zip()方法完成的。

这就是Python zip list of lists的例子。