Python列表理解逻辑示例

Python列表理解逻辑示例,python,list-comprehension,Python,List Comprehension,我正在学习Python中的列表理解,遇到了以下示例: vec = [[11, 21, 31], [42, 52, 62], [73, 83, 93]] var=[vec[i][len(vec)-1-i] for i in range(len(vec))] print(var) 我想确切地理解这行后面的逻辑,列表理解在哪里,以及为什么代码停止迭代到I=2?(我在调试模式下看到了,但我仍然不清楚)。 那么“len(vec)-1-i”到底需要什么呢?我知道len(vec)-1是我列表中的最后一个,但

我正在学习Python中的列表理解,遇到了以下示例:

vec = [[11, 21, 31],
[42, 52, 62],
[73, 83, 93]]
var=[vec[i][len(vec)-1-i] for i in range(len(vec))]
print(var)
我想确切地理解这行后面的逻辑,列表理解在哪里,以及为什么代码停止迭代到I=2?(我在调试模式下看到了,但我仍然不清楚)。 那么“len(vec)-1-i”到底需要什么呢?我知道len(vec)-1是我列表中的最后一个,但为什么是-i呢

var=[vec[i][len(vec)-1-i] for i in range(len(vec))]

这一行表示列表理解。这里您正在为
范围(3)
运行for循环,因此它在
i=2
处停止,作为
0
1
迭代,然后
2
len(vec)-1-i
生成
2
1
0
。您正在访问
vec[0][2],
vec[1]
,然后通过for循环
vec[2][0]

我将逐步解释您的代码:

# This creates a 2D matrix (a nested list as we say in Python).
vec = [[11, 21, 31],
       [42, 52, 62],
       [73, 83, 93]]

# To obtain all the elements of the counterdiagonal in the 2D matrix, we iterate with inital value of i set to `0`, then,   
# Possible values for i varaible will be 0,1,2. 
# Hence, vec[i][len(vec)-1-i] will select following elements:
# vec[0][2] = 31
# vec[1][1] = 52
# vec[2][0] = 73
# These elements will then be stored in a new list named var. Hence when you print var, you'll get : 
var=[vec[i][len(vec)-1-i] for i in range(len(vec))]
# Output : [31, 52, 73]
print(var)
为什么代码停止迭代到i=2?(我在调试模式下看到了,但我仍然不清楚)

什么是
len(vec)
vec
是一个列表列表。
len
只获取最外层的长度。在本例中,
3

请尝试打印(列表(范围(3))
以查看您将获得的
i
的值。(说明:
range
上限是独占的,因此它永远不会达到3。)

这确保了
vec[i]
永远不会超出范围

那么“len(vec)-1-i”到底需要什么呢?我知道len(vec)-1是我列表中的最后一个,但为什么是-i呢

var=[vec[i][len(vec)-1-i] for i in range(len(vec))]
vec[i]
获取当前子列表

len(vec)
是外部列表(3)的长度,
len(vec)-1
是最后一个元素的索引,
i
从0变为
len(vec)-1
(含)

让我们分析一下,对于每个i,len(vec)-1-i将得到什么值:

  • i=0=>2
  • i=1=>1
  • i=2=>0
我们基本上是在用索引“返回”

所以我们得到的是
vec[0][2]
vec[1][1]
vec[2][0]
。也就是说,
vec
的对角线,从右上角到左下角。

len(vec)
等于3,
范围(3)
返回
0,1,2
vec[i][len(vec)-1-i]