Python, каким образом можно объединить матрицу в список без циклов?
Например, есть матрица
[['1', '4', '9', '9', '4', '7'], ['6', '9', '8', '6', '7', '4'],
['1', '1', '6', '1', '1', '1'], ['1', '4', '5', '8', '7', '5'],
['6', '7', '8', '1', '1', '0'], ['6', '9', '9', '9', '7', '7']]
Как можно объединить эту матрицу в список lst=[]
БЕЗ циклов?
Чтобы получился список lst=['1', '4', '9', '9', '4', '7','6', '9', '8', '6', '7', '4','1', '1', '6', '1', '1', '1','1', '4', '5', '8', '7', '5','6', '7', '8', '1', '1', '0', '6', '9', '9', '9', '7', '7']
?
Ответы (4 шт):
Если можно с библиотекой itertools
import itertools
s=[['1', '4', '9', '9', '4', '7'], ['6', '9', '8', '6', '7', '4'],
['1', '1', '6', '1', '1', '1'], ['1', '4', '5', '8', '7', '5'],
['6', '7', '8', '1', '1', '0'], ['6', '9', '9', '9', '7', '7']]
l = list(itertools.chain(*s))
print(l)
['1', '4', '9', '9', '4', '7', '6', '9', '8', '6', '7', '4', '1', '1', '6', '1', '1', '1', '1', '4', '5', '8', '7', '5', '6', '7', '8', '1', '1', '0', '6', '9', '9', '9', '7', '7']
Дисклеймер
start
Нет причин не доверять словам и замечаниям от @strawdog.
Не рекомендуется использовать. Причины:
- не масштабируемость
- квадратичная сложность
O(n^2)
Как вариант оставлю, потому что это решает проблему, хоть и не эффективно и как говорят грязный хак
. Пользуйтесь на свой страх и риск
end
Вот такое решение
matrix = [['1', '4', '9', '9', '4', '7'], ['6', '9', '8', '6', '7', '4'],
['1', '1', '6', '1', '1', '1'], ['1', '4', '5', '8', '7', '5'],
['6', '7', '8', '1', '1', '0'], ['6', '9', '9', '9', '7', '7']]
lst = sum(matrix, [])
Метод sum()
используется как знак +
для всех объектов основного (верхнего) списка. Если суммировать списки, то применяется конкатенация. Следовательно, вы просто друг за другом скидываете все списки в один.
Такой метод применим для любых built-in последовательностей, исключая словари и множества.
Про +
можно почитать разобранный вопрос Что такое + в Python?
UPD
Про второй параметр можно найти в оф доке.
Данный параметр задает начальное значение, к которому будут суммироваться все итерируемые объекты последовательности. По умолчанию этот параметр равен 0
, и является типом данных int
. Если мы не определим в вашем примере начальное значение типа list
мы получим исключение
TypeError: unsupported operand type(s) for +: 'int' and 'list'
Поскольку операция сложения между типами данных list
и int
не определено
Вроде это list comprehension, а не цикл? tio.run
a = [['1', '4', '9', '9', '4', '7'], ['6', '9', '8', '6', '7', '4'],
['1', '1', '6', '1', '1', '1'], ['1', '4', '5', '8', '7', '5'],
['6', '7', '8', '1', '1', '0'], ['6', '9', '9', '9', '7', '7']]
l = [x for b in a for x in b]
print(l)
itertools.chain.from_iterable
:
import itertools
m = [
['1', '4', '9', '9', '4', '7'], ['6', '9', '8', '6', '7', '4'],
['1', '1', '6', '1', '1', '1'], ['1', '4', '5', '8', '7', '5'],
['6', '7', '8', '1', '1', '0'], ['6', '9', '9', '9', '7', '7']
]
lst = list(itertools.chain.from_iterable(m))
print(lst)
Без импортов, циклов и списковых включений:
def flatten(m):
it = iter(m)
lst = []
def rec():
try:
lst.extend(next(it))
except StopIteration:
return
rec()
rec()
return lst
m = [
['1', '4', '9', '9', '4', '7'], ['6', '9', '8', '6', '7', '4'],
['1', '1', '6', '1', '1', '1'], ['1', '4', '5', '8', '7', '5'],
['6', '7', '8', '1', '1', '0'], ['6', '9', '9', '9', '7', '7']
]
lst = flatten(m)
print(lst)
P.S. Ещё можно убрать ограничение на глубину рекурсии.
P.P.S. ... и обойтись без исключений.
P.P.P.S. ... и выписать всё в одну строку.