2015-11-14 5 views
0

Я пытаюсь обернуть вокруг головы, как этот код выполняется:Список Постижение Запуск последовательности

def t(xs): 
    return [[xs[i][j] for i in range(len(xs))] for j in range(len(xs[0]))] 

>>> y = t([[1,2,3],[4,5,6]]) 

Так я думал, что результат будет:

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

установкой for i in range(...) как но заметил, что выход на самом деле:

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

, и я не уверен, почему, это из-за первый цикл находится между квадратными скобками, поэтому он запускается как внутренний цикл? Когда я экспериментировал с этим вопросом и удалил скобки, я получил ответ, который я ожидал сначала, но не уверен, почему и как изменится последовательность.

ответ

0
[[xs[i][j] for i in range(len(xs))] for j in range(len(xs[0]))] 

эквивалентно

result = [] 
for j in range(len(xs[0])): 
    result.append([]) 
    for i in range(len(xs)): 
     result[j].append(xs[i][j]) 

print result 

[xs[i][0] for i in range(len(xs))] with j=0 будет формировать внутреннюю петлю и возвращает список, for j in range(len(xs[0])) будет формировать внешний цикл и будет возвращать список списков.

И когда вы

[xs[i][j] for i in range(len(xs)) for j in range(len(xs[0]))] 

это эквивалентно

result = [] 
for j in range(len(xs[0])): 
    for i in range(len(xs)): 
     result.append(xs[i][j]) 
+0

Спасибо за это, имеет смысл теперь с расширенным кодом. –

+0

Я верю, что циклы 'for' в этом последнем примере кода переключаются. '[x для y в z для x в y]' эквивалентно 'для y в z: для x в y: result.append (x)' –

+0

Ну, порядок цикла здесь не имеет значения .. если он логически эквивалент. – gjha

1

Начиная в y = t([[1,2,3],[4,5,6]]):

xs определяется как [[1,2,3],[4,5,6]] с вышеупомянутым вызовом

Давайте теперь проанализировать возможные результаты каждый for в списке понимания:

for j in range(len(xs[0])) должен давать значения в пределах диапазона 0 <= x <= 2 таких, что x представляет собой целое число в виде неравенства или [0,1,2] если мы должны были представить его в виде массива.

for i in range(len(xs)) должен давать значения в пределах диапазона 0 <= x <= 1 таким образом, что x представляет собой целое число в виде неравенства или [0,1] если мы должны были представить его в виде массива.

Так что же на самом деле происходит?

В понимании списка есть понимание списка, поэтому вы собираетесь создавать массивы в понимании.

Начиная с начального значения j в течение первой итерации дается ссылка 0. С i; он будет иметь два значения для j. Эти значения для i будут [0,1], если мы представим его в виде списка.

Таким образом, первый список внутри внутреннего понимания - [1,4]. «в целом» представление данных в списке понимание в конце первой итерации j теперь [[1,4]]

Когда j является 1; снова будут два возможных значения для i. Значения для i: [0,1], поскольку мощность xs равна 2.

Возврат внутреннего списка i; ваш результат будет [2,5]. Общий список будет выглядеть как [[1,4],[2,5]] в конце второй итерации.

Аналогично процесс будет следовать за 3 итерации, который затем дает результат [[1,4],[2,5],[3,6]]

Рассуждение является комбинация списковых, массив/список индексации и случаи использования range функции на Python.

Смежные вопросы