Подтвердить что ты не робот

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

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

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]. Может ли кто-нибудь объяснить, как это работает?

4b9b3361

Ответ 1

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

[leaf for branch in tree for leaf in branch]

Это помогает думать об этом так.

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

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

Ответ 2

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

      +----------------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

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

result = []
for xs in a:
    for x in xs:
        result.append(x)

Подробнее об этом можно узнать здесь

Ответ 5

Эффективно:

...for xs in a...]

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

...for x in xs]

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

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

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

Ответ 6

Это пример вложенного понимания. Подумайте о a = [[1,2],[3,4],[5,6]] как матрице 3 на 2 (матрица = [[1,2], [3,4], [5,6]]).

       ______
row 1 |1 | 2 |
       ______
row 2 |3 | 4 |
       ______
row 3 |5 | 6 |
       ______

Понимание списка, которое вы видите, - это еще один способ получить все элементы из этой матрицы в список.

Я попытаюсь объяснить это, используя разные переменные, которые, надеюсь, будут иметь больше смысла.

b = [element for row in matrix for element in row]

Первый цикл цикла выполняет итерацию по строкам внутри матрицы, т.е. [1,2],[3,4],[5,6]. Второй цикл выполняет итерацию по каждому элементу в списке из двух элементов.

Я написал небольшую статью о понимании списков на моем веб-сайте http://programmathics.com/programming/python/python-list-comprehension-tutorial/, который фактически затронул очень похожий сценарий на этот вопрос. Я также даю несколько других примеров и объяснений понимания списка python.

Отказ от ответственности: я являюсь создателем этого веб-сайта.

Ответ 7

b = [x для xs в для x в xs] такое же, как:

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

Для лучшего понимания просто перейдите справа налево и добавьте для циклов один за другим, и поскольку он создает List x, стал элементом списка.

Ответ 8

Перечисления списков - это списки, которые генерируют себя с внутренним циклом. Theyre очень распространенная функция в Python, и они выглядят примерно так:

[вещь для вещи в list_of_things]

Хорошо, отлично, но зачем мне это использовать?

Список понятий отлично подходит для использования, когда вы хотите сохранить некоторое пространство. Theyre также удобно, когда вам просто нужно быстро обрабатывать список, чтобы выполнить некоторую повторяющуюся работу над этим списком. Theyre также очень полезно, если вы узнаете о функциональном программировании, но это тема для более позднего курса (подсказка подсказки).

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

Ответ 9

Да, вы можете гнездиться для петель INSIDE для понимания списка. Вы можете даже вставлять в него заявления.

dice_rolls = []
for roll1 in range(1,7):
    for roll2 in range(1,7):
        for roll3 in range(1,7):
            dice_rolls.append((roll1, roll2, roll3))

# becomes

dice_rolls = [(roll1, roll2, roll3) for roll1 in range(1, 7) for roll2 in range(1, 7) 
              for roll3 in range(1, 7)]

Я написал короткую статью о средних объяснениях списков и некоторых других интересных вещах, которые вы можете сделать с помощью python, вам нужно взглянуть, если вам интересно:)

Ответ 10

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

Здесь for xs in a выполняется как внешний цикл, а for x in xs как внутренний цикл. И так, это можно написать, как показано ниже.

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