Вопрос-Ответ

Explanation of how nested list comprehension works?

Объяснение того, как работает понимание вложенных списков?

У меня нет проблем с пониманием этого:

a = [1,2,3,4]
b = [x for x in a]

Я думал, что это все, но потом я нашел этот фрагмент:

a = [[1,2],[3,4],[5,6]]
b = [x for xs in a for x in xs]

Что делает b = [1,2,3,4,5,6]. Проблема в том, что у меня проблемы с пониманием синтаксиса в [x for xs in a for x in xs], кто-нибудь может объяснить, как это работает?

Переведено автоматически
Ответ 1

Ах, непонятные "вложенные" понимания. Циклы разворачиваются в том же порядке, что и в понимании.

[leaf for branch in tree for leaf in branch]

Это помогает думать об этом следующим образом.

for branch in tree:
for leaf in branch:
yield leaf

В PEP202 утверждается, что этот синтаксис с "самым быстрым изменением последнего индекса" является "правильным", особенно без объяснения почему.

Ответ 2

если a = [[1,2],[3,4],[5,6]], то если мы развернем этот список, мы получим:

      +----------------a------------------+ 
| +--xs---+ , +--xs---+ , +--xs---+ | for xs in a
| | x , x | | x , x | | x , x | | for x in xs
a = [ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] ]
b = [ x for xs in a for x in xs ] == [1,2,3,4,5,6] #a list of just the "x"s
Ответ 3

b = [x for xs in a for x in xs] аналогично следующему вложенному циклу.

b = []
for xs in a:
for x in xs:
b.append(x)
Ответ 4

Эффективно:

...for xs in a...]

выполняет итерацию по вашему основному (внешнему) списку и возвращает каждый из ваших подсписков по очереди.

...for x in xs]

затем выполняется итерация по каждому из этих вложенных списков.

Это можно переписать как:

b = []
for xs in a:
for x in xs:
b.append(x)
python list