#python
#python
Вопрос:
У меня есть эта матрица
mat = [["a", 1], ["a", 0, 2], ["a", 0, 0, 3],
["b", 1], ["b", 0, 2], ["b", 0, 0, 3],
["c", 1], ["c", 0, 2], ["c", 0, 0, 3]]
Я хочу объединить списки, начинающиеся с одной и той же буквы, поэтому желаемый результат
mat = [["a", 1, 2, 3],
["b", 1, 2, 3],
["c", 1, 2, 3]]
Это может быть простой проблемой, и я просто переусердствовал, но я был бы очень признателен за вашу помощь.
Комментарии:
1. что такое
a
— строка? переменная?2. Это строка, я просто отредактировал сообщение, чтобы поместить буквы в кавычки, спасибо
3. Можем ли мы предположить, что все записи в матрице всегда следуют этому шаблону? Также знаем ли мы, что размеры матрицы не меняются?
4. Все записи следуют этому шаблону, но некоторые записи содержат больше нулей перед числом. Это сделало бы некоторые записи длиннее других, поэтому короткие из них впоследствии получают нули, поэтому все списки в конечном итоге имеют одинаковую длину
Ответ №1:
import itertools
mat = [['a', 1], ['a', 0, 2], ['a', 0, 0, 3],
['b', 1], ['b', 0, 2], ['b', 0, 0, 3],
['c', 1], ['c', 0, 2], ['c', 0, 0, 3]]
output = []
for x,g in itertools.groupby(mat, lambda l:l[0]):
t = list(x)
for i,l in enumerate(g):
t.append(l[i 1])
output.append(t)
Вывод
[['a', 1, 2, 3], ['b', 1, 2, 3], ['c', 1, 2, 3]]
Ответ №2:
Группируйте по первому элементу, предполагая, что они являются смежными, вы можете использовать groupby, а затем использовать zip_longest для параллельного перебора всех списков:
from itertools import zip_longest, groupby
from operator import itemgetter
mat = [['a', 1], ['a', 0, 2], ['a', 0, 0, 3],
['b', 1], ['b', 0, 2], ['b', 0, 0, 3],
['c', 1], ['c', 0, 2], ['c', 0, 0, 3]]
def reduce(group):
_, *tail = zip_longest(*group, fillvalue=0)
return [sum(e) for e in tail]
res = [[k, *reduce(group)] for k, group in groupby(mat, key=itemgetter(0))]
print(res)