2014-10-15 3 views
1

Я хочу, чтобы преобразовать данные матрицы а, Ь в квадратные матрицы, вставляя нули везде, где необходимыпреобразовать матрицу (список списков) в квадратную матрицу в питоне

a = [[1,2],[3,4],[5,6],[7,8]] 
b = [[1,2,3,4],[5,6,7,8]] 

Я хочу выход быть

a1 = [[1,2,0,0],[3,4,0,0],[5,6,0,0],[7,8,0,0]] 
b1 = [[1,2,3,4],[5,6,7,8][0,0,0,0],[0,0,0,0]] 

У меня есть проблема с установкой пакетного пакета на моей машине. Любое решение без использования numpy очень помогло бы.

Благодаря

+2

ОК. Что вы пробовали? – Bonifacio2

ответ

4
>>> a = [[1,2], [3,4], [5,6], [7,8]] 
>>> b = [[1,2,3,4], [5,6,7,8]] 
>>> 
>>> def matrix(a, n): 
...  for row in a: 
...   yield row + [0] * (n - len(row)) 
...  for i in range(len(a), n): 
...   yield [0] * n 
... 
>>> list(matrix(a, 4)) 
[[1, 2, 0, 0], [3, 4, 0, 0], [5, 6, 0, 0], [7, 8, 0, 0]] 
>>> list(matrix(b, 4)) 
[[1, 2, 3, 4], [5, 6, 7, 8], [0, 0, 0, 0], [0, 0, 0, 0]] 
+0

Спасибо ... это сработало :) – user1946217

0

Эта маленькая функция должна сделать трюк:

def squarify(lst, n): 
    for sublist in lst: 
     while len(sublist) < n: 
      sublist.append(0) 

    while len(lst) < n: 
     lst.append([0]*n) 
0

Вам нужно две части информации: самый длинный ряд, и наибольшее количество столбцов. Чтобы получить самую длинную строку, предполагая, что вы можете предположить, что каждая матрица имеет определенное количество строк, вам нужно сделать что-то вроде

rowAlen = len(a[0]) 
rowBlen = len(b[0]) 
longestRow = 0; 
if rowAlen > rowBlen: 
    longestRow = rowAlen 
else: 
    longestRow = rowBlen 

Тогда вам нужно получить число столбцов матрицы с наиболее колонны.

colAlen = len(a) 
colBlen = len(b) 
maxCol = 0; 
if colAlen > colBlen: 
    maxCol = colAlen 
else: 
    maxCol = colBlen 

Теперь, когда у вас есть longestRow и maxCol, вы можете манипулировать матрицами.

for x in range(0,maxCol): 
    if colAlen <= x: 
     a.append([]) 

    if colBlen <= x: 
     b.append([]) 

    for y in range(0, longestRow): 
     if len(a[x]) <= y: 
      a[x].append(0) 

     if len(b[x]) <= y: 
      b[x].append(0) 
0

Это вернет результат, который вы ищете, а также измените исходный список, если он был сохранен в переменной.

def matrize(L): 
    msize = max(len(L), max([len(subL) for subL in L])) 
    for item in L: 
    while len(item)<msize: item.append(0) 
    zrow = [0]*msize 
    while len(L)< msize: L.append(zrow) 
    return L 
Смежные вопросы