如何使用列表推导格式化列表的列表?
我在程序中遇到了一个函数的问题,这个函数需要把多行用空格分开的数字格式化。到目前为止,下面的代码可以把没有格式的数字列表变成一个用空格分开的表格,且没有方括号:
def printMatrix(matrix):
return ('\n'.join(' '.join(map(str, row)) for row in matrix))
不过,我希望输出的所有数字能够整齐对齐。我现在搞不清楚怎么把格式化操作符放进列表推导式里来实现这个效果。输入的总是一个方阵(比如2x2、3x3等)。为了更清楚,这里是程序的其余部分:
# Magic Squares
def main():
file = "matrix.txt"
matrix = readMatrix(file)
print(printMatrix(matrix))
result1 = colSum(matrix)
result2 = rowSum(matrix)
result3 = list(diagonalSums(matrix))
sumList = result1 + result2 + result3
check = checkSums(sumList)
if check == True:
print("This matrix is a magic square.")
else:
print("This matrix is NOT a magic square.")
def readMatrix(file):
contents = open(file).read()
with open(file) as contents:
return [[int(item) for item in line.split()] for line in contents]
def colSum(matrix):
answer = []
for column in range(len(matrix[0])):
t = 0
for row in matrix:
t += row[column]
answer.append(t)
return answer
def rowSum(matrix):
return [sum(column) for column in matrix]
def diagonalSums(matrix):
l = len(matrix[0])
diag1 = [matrix[i][i] for i in range(l)]
diag2 = [matrix[l-1-i][i] for i in range(l-1,-1,-1)]
return sum(diag1), sum(diag2)
def checkSums(sumList):
return all(x == sumList[0] for x in sumList)
def printMatrix(matrix):
return ('\n'.join(' '.join(map(str, row)) for row in matrix))
main()
2 个回答
0
像这样的代码应该能解决问题:
def print_matrix(matrix, pad_string=' ', padding_ammount=1,
number_delimiter=' ', number_width=3):
'''
Converts a list of lists holding integers to a string table.
'''
format_expr = '{{:{}>{}d}}'.format(number_delimiter, number_width)
padding = pad_string * padding_ammount
result = ''
for row in matrix:
for col in row:
result = '{}{}{}'.format(
result,
padding,
format_expr
).format(col)
result = '{}\n'.format(result)
return result
a = [
[1, 2, 3, 22, 450],
[333, 21, 13, 5, 7]
]
print(print_matrix(a))
# 1 2 3 22 450
# 333 21 13 5 7
print(print_matrix(a, number_delimiter=0)
# 001 002 003 022 450
# 333 021 013 005 007
1
def printMatrix(matrix):
return "\n".join((("{:<10}"*len(row)).format(*row))for row in matrix)
In [19]: arr=[[1,332,3,44,5],[6,7,8,9,100]]
In [20]: print(printMatrix(arr))
1 332 3 44 5
6 7 8 9 100
这段代码 "{:<10}"*len(row)
的意思是为每个数字创建一个左对齐的格式,宽度为10个字符。这里的 <:10
表示数字要靠左对齐,并且占用10个字符的空间。接着,我们用 format(*row)
来把每一行的数据拆开,填入这些格式中。