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]
затем выполняется итерация по каждому из этих вложенных списков.