У меня есть структура вида:
lst= [[['A'], ['B'], ['C']], [['A'], ['B'], ['D'], ['E']], [['B'], ['C']]]
Я хочу свернуть самые внутренние слои списков, чтобы получить следующую структуру:
lst= [['A', 'B', 'C'], ['A', 'B', 'D', 'E'], ['B', 'C']]
Я попытался сгладить список, выполнив следующие действия:
[item for sublst in lst for item in sublst]
Но вместо этого все слои свертываются в одномерный список.
Каков самый питонический способ решить эту проблему?






Вам нужно перебирать подсписки и индексировать их, чтобы получить желаемый результат (но это предполагает, что ваш внутренний список содержит только один элемент):
lst= [[['A'], ['B'], ['C']], [['A'], ['B'], ['D'], ['E']], [['B'], ['C']]]
result = [[y[0] for y in x] for x in lst]
# [['A', 'B', 'C'], ['A', 'B', 'D', 'E'], ['B', 'C']]
При желании вы можете использовать chain.from_iterable из itertools (теперь это обрабатывает любое количество элементов во внутренних списках):
from itertools import chain
lst= [[['A'], ['B'], ['C']], [['A'], ['B'], ['D'], ['E']], [['B'], ['C']]]
result = [list(chain.from_iterable(x)) for x in lst]
Вам нужно сгладить элементыlst, а не саму lst.
Поэтому используйте двойное понимание списка внутри другого понимания списка, где внешнее понимание выполняет итерацию по вашему списку верхнего уровня:
[[item for inner in sublst for item in inner] for sublst in lst]
Поскольку каждый из ваших самых внутренних списков содержит только один элемент, вы также можете использовать индексирование для получения этих значений:
[[inner[0] for inner in sublst] for sublst in lst]
Демо:
>>> lst = [[['A'], ['B'], ['C']], [['A'], ['B'], ['D'], ['E']], [['B'], ['C']]]
>>> [[item for inner in sublst for item in inner] for sublst in lst]
[['A', 'B', 'C'], ['A', 'B', 'D', 'E'], ['B', 'C']]
>>> [[inner[0] for inner in sublst] for sublst in lst]
[['A', 'B', 'C'], ['A', 'B', 'D', 'E'], ['B', 'C']]