Как удалить запятые и т. Д. Из матрицы в Python - PullRequest
0 голосов
/ 30 мая 2010

скажем, у меня есть матрица, которая выглядит следующим образом:

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

как мне сделать это на отдельных линиях:

[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]

, а затем удалите запятые и т. Д .:

0 0 0 0 0

А также сделать его пустым вместо 0, чтобы цифры можно было вводить позже, так что в итоге это будет выглядеть так:

_ 1 2 _ 1 _ 1

(пробелы не подчеркивают)

спасибо

Ответы [ 6 ]

4 голосов
/ 30 мая 2010

Это выделяет 4 пробела для каждого числа в матрице. Возможно, вам придется изменить это в зависимости от ваших данных.

Здесь также используется метод строкового формата , представленный в Python 2.6. Спросите, хотите ли вы посмотреть, как это сделать по-старому.

matrix=[[0, 1, 2, 0, 0], [0, 1, 0, 0, 0], [20, 0, 0, 0, 1]]
for row in matrix:
    data=(str(num) if num else ' ' for num in row])   # This changes 0 to a space
    print(' '.join(['{0:4}'.format(elt) for elt in data]))

выходы

     1    2             
     1                  
20                  1   
3 голосов
/ 30 мая 2010

Вот более короткая версия ответа ~ Untubu

M = [[0, 1, 2, 0, 0], [0, 1, 0, 0, 0], [20, 0, 0, 0, 1]]
for row in M:
    print " ".join('{0:4}'.format(i or " ") for i in row)
1 голос
/ 30 мая 2010

Этот ответ также вычисляет соответствующую длину поля, вместо того, чтобы угадывать 4:)

def pretty_print(matrix):
  matrix = [[str(x) if x else "" for x in row] for row in matrix]
  field_length = max(len(x) for row in matrix for x in row)
  return "\n".join(" ".join("%%%ds" % field_length % x for x in row)
                   for row in matrix)

Здесь слишком много итераций, поэтому, если производительность в критическом состоянии, вы захотите выполнить начальный str() проход и field_length расчет в одном нефункциональном цикле.

>>> matrix=[[0, 1, 2, 0, 0], [0, 1, 0, 0, 0], [20, 1, 1, 1, 0.30314]]
>>> print pretty_print(matrix)
              1       2                
              1                        
     20       1       1       1 0.30314
>>> matrix=[[1, 0, 0], [0, 1, 0], [0, 0, 1]]
>>> print pretty_print(matrix)
1    
  1  
    1
1 голос
/ 30 мая 2010
#!/usr/bin/env python

m = [[80, 0, 3, 20, 2], [0, 2, 101, 0, 6], [0, 72 ,0, 0, 20]]

def prettify(m):
    for r in m:
        print ' '.join(map(lambda e: '%4s' % e, r)).replace(" 0 ", "   ")

prettify(m)

# => prints ...
# 80         3   20    2
#       2  101         6
#      72             20
0 голосов
/ 31 мая 2010

Если вы много работаете с матрицами, я настоятельно рекомендую использовать матрицу numpy (сторонний пакет). Он имеет много функций, которые раздражают, связанные с итерацией (например, скалярное умножение и сложение матриц).

http://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.html

Затем, если вы хотите, чтобы "print" выводил ваш конкретный формат, просто наследуйте от матрицы numpy и замените методы repr и str некоторыми решениями, представленными здесь другими.

class MyMatrix(numpy.matrix):
   def __repr__(self):
      repr = numpy.matrix.__repr__(self)

      ...

      return pretty_repr

   __str__ = __repr__
0 голосов
/ 30 мая 2010
def matrix_to_string(matrix, col):
        lines = []
        for e in matrix:
            lines.append(str(["{0:>{1}}".format(str(x), col) for x in e])[1:-1].replace(',','').replace('\'',''))
        pattern = re.compile(r'\b0\b')
        lines = [re.sub(pattern, ' ', e) for e in lines]
        return '\n'.join(lines)

Пример:

matrix = [[0,1,0,3],[1,2,3,4],[10,20,30,40]]
print(matrix_to_string(matrix, 2))

Выход:

    1     3
 1  2  3  4
10 20 30 40
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...