Свести список списков с пониманием списка - PullRequest
0 голосов
/ 26 февраля 2019

Почему приведенное ниже понимание списка дает ошибку?Чего мне не хватает?

a = [
[(1, 2), (11, 22), (111, 222)],
[(3, 4), (33, 44), (333, 444)],
[(5, 6), (55, 66), (555, 666)]
]

b = [k for k in j for j in i for i in a]
print(sorted(b))

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

Ошибка: Ошибка типа: 'int'объект не повторяется

Желаемый результат: [1, 2, 3, 4, 5, 6, 11, 22, 33, 44, 55, 66, 111, 222, 333, 444, 555, 666]

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

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

Итак, если у нас есть:

for sublist in a:
    for tup in sublist:
        for item in tup:
            print(item)

Мы можем переписать это как

[print(item) for sublist in a for tup in sublist for item in tup]

> [1, 2, 11, 22, 111, 222, 3, 4, 33, 44, 333, 444, 5, 6, 55, 66, 555, 666]

(и так до бесконечности)

0 голосов
/ 26 февраля 2019

Порядок в списке понимания неправильный.Вот правильное решение:

In [5]: a = [
   ...: [(1, 2), (11, 22), (111, 222)],
   ...: [(3, 4), (33, 44), (333, 444)],
   ...: [(5, 6), (55, 66), (555, 666)]
   ...: ]
   ...: 
   ...: b = [j for x in a for y in x for j in y]
   ...: 
   ...: 
   ...: 

In [6]: 

In [6]: b
Out[6]: [1, 2, 11, 22, 111, 222, 3, 4, 33, 44, 333, 444, 5, 6, 55, 66, 555, 666]

In [7]: sorted(b) 
Out[7]: [1, 2, 3, 4, 5, 6, 11, 22, 33, 44, 55, 66, 111, 222, 333, 444, 555, 666]

Вот SO-обсуждение, объясняющее понимание вложенного списка: Объяснение того, как работает понимание вложенного списка?

...