Большинство ответов работают только для этой конкретной формы вложенного списка, но также возможно создать решение, которое будет работать с любой формой вложенного списка.
def flatten_from(sequence, path=[]):
start = path.pop(0) if path else 0
for item in sequence[start:]:
if isinstance(item, (list, tuple)):
yield from flatten_from(item, path)
else:
yield item
С примером из вопроса
>>> list(flatten_from([[1, 2, 3], [4, 5, 10], [6, 2, 1]], [0, 2]))
[3, 4, 5, 10, 6, 2, 1]
Работает также с любой формой и уровнем вложенности входных данных.
m = [[1], [[2], [3, 4, 5, 6, 7]], 8, [9, [10, 11]]]
flatten_from(m, [])) # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
flatten_from(m, [2]) # 8, 9, 10, 11
flatten_from(m, [1, 1, 3]) # 6, 7, 8, 9, 10, 11
Хотя это немного ублюдочный алгоритм. С одной стороны, он использует приятные концепции функционального программирования: рекурсия и выход.
С другой стороны, он основан на побочном эффекте мутации аргумента пути с list.pop
, так что это не чистая функция.