Понимание списка Python логично в пример - PullRequest
0 голосов
/ 18 октября 2019

Я изучаю понимание списка в 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)

Я хотел точно понять логику, лежащую за строкой, где находится понимание списка, и почему код перестает повторяться вя = 2? (Я видел в режиме отладки, но мне все еще не ясно). Тогда что именно нужно для выражения "len (vec) -1 -i? Я знаю, что len (vec) -1 является последним в моем списке, но почему -i?

Ответы [ 3 ]

0 голосов
/ 18 октября 2019

Я объясню ваш код шаг за шагом:

# 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)
0 голосов
/ 18 октября 2019

почему код перестает повторяться до i = 2? (Я видел в режиме отладки, но мне все еще не ясно)

for i in range(len(vec))

Что такое len(vec)? vec - список списков. len получает только крайнюю длину. В этом случае 3.

Попробуйте print(list(range(3)), чтобы увидеть, какие значения i вы получите. (Объяснение: range верхняя граница является исключительной, поэтому она никогда не достигнет 3.)

Это гарантирует, что vec[i] никогда не выйдет за пределы диапазона.

Тогда что именно делаетэто принимает в "len (vec) -1 -i? Я знаю, что len (vec) -1 является окончательным в моем списке, но почему -i?

vec[i][len(vec)-1-i]

vec[i] выбираеттекущий подсписок.

len(vec) - длина внешнего списка (3), len(vec)-1 - индекс последнего элемента, i - от 0 до len(vec)-1 (включительно)

Давайте проанализируем, какие значения получит len(vec)-1-i для каждого i:

  • i = 0 => 2
  • i = 1 => 1
  • i = 2 => 0

Мы в основном "возвращаемся" с индексом.

Итак, мы получаем vec[0][2], vec[1][1], vec[2][0]. То есть диагональ vec от верхнего правого до нижнего левого.

0 голосов
/ 18 октября 2019
var=[vec[i][len(vec)-1-i] for i in range(len(vec))]

Эта строка обозначает понимание списка. Здесь вы запускаете цикл for для range(3), поэтому он останавливается на i=2, повторяясь как 0, 1 и затем 2. len(vec)-1 -i производит 2, 1, 0. Вы получаете доступ к vec[0][2], vec[1][1], а затем vec[2][0] через цикл for.

...