2012-01-05 5 views
2

나는 여러 행의 데이터를 인쇄해야만한다. C++로 std :: cout의 매개 변수를 변경할 수는 있지만 파이썬으로 어떻게 할 수 있는지 이해할 수 없습니다.파이썬의 꽤 좋은 행렬 인쇄

1 arc1.tgz   First  15.02.1992 
16 arc2modified.tgz Second  today 
112 arc89.tgz   Corrupted unknown 

영리한 아이디어는 하나 개의 목록에 넣어 다음 각 심볼을 계산하는 것입니다 것으로 보인다 :

row1 = [1, 'arc1.tgz', 'First', '15.02.1992'] 
row2 = [16, 'arc2modified.tgz', 'Second', 'today'] 
row3 = ['112', 'arc89.tgz', 'Corrupted', 'unknown'] 

내가 이런 식으로 텍스트를 인쇄 할 예를 들어,이 있습니다 문자열을 입력 한 다음 공백을 추가하십시오. 그러나 더 영리한 방법이 있는지 알고 싶습니다.

주요 문제는 기본 파이썬 모듈 만 사용할 수 있다는 것입니다. 그것을 할 가능성이 있습니까? 고마워요!

답변

9
my_matrix = [row1, row2, row3] 
print "\n".join(["\t".join(map(str, r)) for r in my_matrix]) 

ETA : 내 원래의 대답은 (오히려 탭보다) 패딩 공간을 사용하여, 당신은 고정 폭으로 각 열을 원했다는 것을 놓쳤다. 또한 가장 긴 데이텀과 다음 열 사이에 정확히 두 개의 공백이 필요한 것처럼 보입니다. 이 경우, 그것은 다음과 같이 수행 할 수 있습니다 (문자열가 내장 된 기본 파이썬 모듈이 있습니다) : 텍스트의 아이폰에 탭 간격보다 높은 경우

import string 

max_lens = [max([len(str(r[i])) for r in my_matrix]) 
       for i in range(len(my_matrix[0]))] 

print "\n".join(["".join([string.ljust(str(e), l + 2) 
       for e, l in zip(r, max_lens)]) for r in my_matrix]) 
+1

문제가 발생한다. 그런 다음 행은 다른 행에 상대적으로 오프셋됩니다. 솔루션은 먼저 각 열의 최대 항목 길이를 얻은 다음 그에 따라 인쇄합니다. – joaquin

+0

아! 훌륭해 ! upvoted !! – joaquin