Как читать вслух Python List Comp понять? - PullRequest
22 голосов
/ 30 января 2012

Мой вопрос о Python Понимание списка удобочитаемость. Когда я сталкиваюсь с кодом со сложными / вложенными списками, я обнаруживаю, что мне приходится перечитывать их несколько раз, чтобы понять цель.

Есть ли интуитивно понятный способ прочитать вслух списки? Похоже, я должен начать «читать» с середины, затем прочитать , если условия (если есть), и прочитать выражение последний.

Вот как я мог бы прочитать следующую строку кода вслух, чтобы понять это:

[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]

"Для каждого элемента в Списке x и каждого элемента в Списке y, , если два элемента не совпадают , создать список кортежей."

Два примера, с которыми я борюсь: Как бы вы прочитали вслух следующий список понятий?

  1. Из другого вопроса в Переполнение стека: [x for b in a for x in b]

  2. Документация Python имеет этот пример: [[row[i] for row in matrix] for i in range(4)]

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

Ответы [ 2 ]

33 голосов
/ 30 января 2012

Я обычно развертываю это в своем уме в генерирующий цикл, так что, например,

[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]

- это список для генератора

for x in [1,2,3]:
    for y in [3,1,4]:
        if x != y:
            yield (x, y)

Пример # 1

[x for b in a for x in b] является пониманием для

for b in a:
    for x in b:
        yield x

Пример результата для a = [[1,2,3],[4,5,6]]: [1, 2, 3, 4, 5, 6]


Пример # 2

[[row[i] for row in matrix] for i in range(4)] (обратите внимание, что внутреннее выражение - это другое понимание!):

for i in range(4):
    yield [row[i] for row in matrix]

, которое развернуто

for i in range(4):
    l = []

    for row in matrix:
        l.append(row[i])

    yield l
4 голосов
/ 30 января 2012

"Построить список X на основе Y и Z, для которых Q истинно."

...