В Python вы можете иметь несколько итераторов в понимании списка, например
[(x,y) for x in a for y in b]
для некоторых подходящих последовательностей а и б. Я знаю семантику вложенных циклов в списках Python.
Мой вопрос: может ли один итератор в понимании ссылаться на другой? Другими словами: Могу ли я иметь что-то вроде этого:
[x for x in a for a in b]
где текущее значение внешнего цикла является итератором внутреннего?
Как пример, если у меня есть вложенный список:
a=[[1,2],[3,4]]
каким должно быть выражение для понимания списка для достижения этого результата:
[1,2,3,4]
?? (Пожалуйста, перечислите только ответы на осмысление, так как это то, что я хочу узнать).
источник
[x for b in a for x in b]
Это всегда было связано с питоном. Этот синтаксис такой обратный. Общая формаx for x in y
всегда имеет переменную непосредственно после for, передает выражение слева от for. Как только вы сделаете двойное понимание, ваша последняя итеративная переменная внезапно окажется настолько «далекой». Это неловко и совсем не читается естественноЯ надеюсь, что это поможет кому-то еще, так
a,b,x,y
как не имеет большого значения для меня! Предположим, у вас есть текст, полный предложений, и вы хотите массив слов.Мне нравится думать о списочном понимании как о растягивании кода по горизонтали.
Попробуйте разбить его на:
Пример:
Это также работает для генераторов
источник
Ну и дела, я думаю, что нашел ответ: я не заботился о том, какая петля является внутренней, а какая внешней. Понимание списка должно быть таким:
чтобы получить желаемый результат, и да, одно текущее значение может быть итератором для следующего цикла.
источник
Порядок итераторов может показаться нелогичным.
Взять к примеру:
[str(x) for i in range(3) for x in foo(i)]
Давайте разложим это:
источник
[(output in loop 2) (loop 1) (loop 2)]
с(loop 1) = for i in range(3)
а(loop 2) = for x in foo(i):
и(output in loop 2) = str(x)
.ThomasH уже добавил хороший ответ, но я хочу показать, что происходит:
Я думаю, что Python анализирует понимание списка слева направо. Это означает, что первый
for
цикл, который происходит, будет выполнен первым.Вторая «проблема» в том, что она
b
«просочилась» из списка. После первого успешного понимания спискаb == [3, 4]
.источник
x = 'hello';
[x for x in xrange(1,5)];
print x # x is now 4
Если вы хотите сохранить многомерный массив, следует вложить скобки массива. см. пример ниже, где каждый добавляется к каждому элементу.
источник
Эта техника памяти мне очень помогает:
[ <RETURNED_VALUE> <OUTER_LOOP1> <INNER_LOOP2> <INNER_LOOP3> ... <OPTIONAL_IF> ]
И теперь вы можете думать о R eturn + O Uter петли , как только R IGHT O rder
Зная выше, порядок в списке, полный даже для 3 циклов, кажется простым:
потому что выше просто:
для итерации одного вложенного списка / структуры, методика та же: для
a
вопроса:друг для друга вложенный уровень
и так далее
источник
Я чувствую, что это легче понять
источник
Кроме того, вы можете использовать точно такую же переменную для члена списка ввода, к которому в данный момент осуществляется доступ, и для элемента внутри этого члена. Тем не менее, это может даже сделать его более (список) непонятным.
Сначала
for x in input
выполняется оценка, ведущая к одному списку элементов ввода, затем Python проходит по второй части,for x in x
во время которой значение x перезаписывается текущим элементом, к которому он обращается, затем первоеx
определяет, что мы хотим вернуть.источник
Эта функция flatten_nlevel рекурсивно вызывает вложенный список list1 для перехода на один уровень. Попробуйте это
вывод:
источник
flatten_nlevel(sublist, flat_list)
, правда ?!