Python中的嵌套列表理解
列表理解是Python最令人惊奇的特性之一。这是一种通过迭代可迭代对象来创建列表的聪明而简洁的方法。嵌套列表推导只不过是另一个列表推导中的列表推导,这与嵌套 for 循环非常相似。
让我们看一些例子来了解嵌套列表推导可以做什么:
示例 1:
I want to create a matrix which looks like below:
matrix = [[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]]
以下代码对给定任务使用嵌套 for 循环:
matrix = []
for i in range(5):
# Append an empty sublist inside the list
matrix.append([])
for j in range(5):
matrix[i].append(j)
print(matrix)
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
使用嵌套列表推导可以在一行中实现相同的输出:
# Nested list comprehension
matrix = [[j for j in range(5)] for i in range(5)]
print(matrix)
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
解释:
The syntax of the above program is shown below:
[expression for i in range(5)] –> which means that execute this expression and append its output to the list until variable i iterates from 0 to 4.
For example:- [i for i in range(5)] –> In this case, the output of the expression
is simply the variable i itself and hence we append its output to the list while i
iterates from 0 to 4.
Thus the output would be –> [0, 1, 2, 3, 4]
But in our case, the expression itself is a list comprehension. Hence we need to first
solve the expression and then append its output to the list.
expression = [j for j in range(5)] –> The output of this expression is same as the
example discussed above.
Hence expression = [0, 1, 2, 3, 4].
Now we just simply append this output until variable i iterates from 0 to 4 which would
be total 5 iterations. Hence the final output would just be a list of the output of the
above expression repeated 5 times.
Output: [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
示例 2:
Suppose I want to flatten a given 2-D list:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Expected Output: flatten_matrix = [1, 2, 3, 4, 5, 6, 7, 8, 9]
这可以使用嵌套的 for 循环来完成,如下所示:
# 2-D List
matrix = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
flatten_matrix = []
for sublist in matrix:
for val in sublist:
flatten_matrix.append(val)
print(flatten_matrix)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
同样,这可以使用嵌套列表理解来完成,如下所示:
# 2-D List
matrix = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
# Nested List Comprehension to flatten a given 2-D matrix
flatten_matrix = [val for sublist in matrix for val in sublist]
print(flatten_matrix)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
解释:
In this case, we need to loop over each element in the given 2-D list and append it
to another list. For better understanding, we can divide the list comprehension into
three parts:
The first line suggests what we want to append to the list. The second line is the
outer loop and the third line is the inner loop.
‘for sublist in matrix’ returns the sublists inside the matrix one by one which would be:
[1, 2, 3], [4, 5], [6, 7, 8, 9]
‘for val in sublist’ returns all the values inside the sublist.
Hence if sublist = [1, 2, 3], ‘for val in sublist’ –> gives 1, 2, 3 as output one by one.
For every such val, we get the output as val and we append it to the list.
示例 3:
Suppose I want to flatten a given 2-D list and only include those strings whose lengths are less than 6:
planets = [[‘Mercury’, ‘Venus’, ‘Earth’], [‘Mars’, ‘Jupiter’, ‘Saturn’], [‘Uranus’, ‘Neptune’, ‘Pluto’]]
Expected Output: flatten_planets = [‘Venus’, ‘Earth’, ‘Mars’, ‘Pluto’]
这可以使用嵌套 for 循环中的 if 条件来完成,如下所示:
flatten_matrix = [val
for sublist in matrix
for val in sublist]
# 2-D List of planets
planets = [['Mercury', 'Venus', 'Earth'], ['Mars', 'Jupiter', 'Saturn'], ['Uranus', 'Neptune', 'Pluto']]
flatten_planets = []
for sublist in planets:
for planet in sublist:
if len(planet) < 6:
flatten_planets.append(planet)
print(flatten_planets)
这也可以使用嵌套列表推导来完成,如下所示:
['Venus', 'Earth', 'Mars', 'Pluto']
# 2-D List of planets
planets = [['Mercury', 'Venus', 'Earth'], ['Mars', 'Jupiter', 'Saturn'], ['Uranus', 'Neptune', 'Pluto']]
# Nested List comprehension with an if condition
flatten_planets = [planet for sublist in planets for planet in sublist if len(planet) < 6]
print(flatten_planets)
解释:
This example is quite similar to the previous example but in this example, we just
need an extra if condition to check if the length of a particular planet is less than
6 or not.
This can be divided into 4 parts as follows:
flatten_planets = [planet
for sublist in planets
for planet in sublist
if len(planet) < 6]