2013-05-19 3 views
0

나는 문자열과 수레를 모두 요소로 포함하는 여러 목록을 가지고 있습니다.파이썬에서 numpy.savetxt를 사용하여 서로 다른 길이의 열을 정렬하는 방법은 무엇입니까?

KIC 7742534 , KIC 76  
Variable Star of RR Lyr type , Variable Star  
V* V368 Lyr , V* V33 Lyr  
KIC 7742534 , KIC 76  
4.0 , 5.0  
0.4564816 , 0.45  

이상적인 출력 내가 얻을 수있는 방법 (정렬 된 헤더 포함)이 같은

#ELEMENT1       ELEMENT2 
KIC 7742534      , KIC 76  
Variable Star of RR Lyr type , Variable Star  
V* V368 Lyr      , V* V33 Lyr  
KIC 7742534      , KIC 76  
4.0        , 5.0  
0.4564816      , 0.45 

을 보일 것이다

import numpy as num 

COLUMN_1 = ['KIC 7742534', 'Variable Star of RR Lyr type' , 'V* V368 Lyr', 
     'KIC 7742534', '4.0', '0.4564816'] 

COLUMN_2 = ['KIC 76', 'Variable Star' , 'V* V33 Lyr', 
     'KIC 76', '5.0', '0.45'] 

DAT = num.column_stack((COLUMN_1, COLUMN_2)) 
num.savetxt('SAVETXT.txt', DAT, delimiter=' ', fmt='{:^10}'.format('%s')) 

이 파일을 실행했을 때 얻을 출력은 다음과 같다 문자열에 정의 된 최대 너비가없는 경우이 같은 출력 (정렬 된 머리글 포함). 나는 문자열 (fmt)의 형식을 수정하려고 시도했지만, 지금까지는 운이 없다.

- 고마워요!

답변

1

당신은

max_len = max(max(map(len,l)) for l in zip(COLUMN_1,COLUMN_2)) 

방법과 유사한 방법이 달성되는, (당신이 어떻게 보는가에 따라 또는 입력)하여 출력의 긴 행의 최대 문자열 길이를 계산해야합니다.

with open('ofile.txt','w+') as f: 
    max_len = max(max(map(len,l)) for l in zip(COLUMN_1,COLUMN_2)) 
    for line in zip(COLUMN_1,COLUMN_2): 
     f.write(','.join(('{:<%s}' % (max_len)).format(e) for e in line)+'\n') 

:

fmt=('{:^%d}' % max_len).format('%s')

다음 비 NumPy와 예제는 예상 출력을 보여줍니다 : 그 후 당신은 당신과 같이 할 수 MAX_LEN의 값에 따라 동적으로 fmt 매개 변수를 변경해야 다음을 포함하는 ofile.txt 텍스트 파일을 생성합니다.

KIC 7742534     ,KIC 76      
Variable Star of RR Lyr type,Variable Star    
V* V368 Lyr     ,V* V33 Lyr     
KIC 7742534     ,KIC 76      
4.0       ,5.0       
0.4564816     ,0.45   
+0

이것은 내가 찾고있는 것입니다! Thanks @ HennyH – Victor

+0

이와 같이 포맷팅 방법을 수동으로 연결할 필요가 없습니다. 중첩 된 형식 만 사용하십시오. 예를 들어,''{1 :^{0}}. format ('% s', max_len)'. 그리고 그것들을 수동으로 체인으로 묶고 싶다면, 왜'%'-formatting과'{}'-formatting을 번갈아 사용해야합니까? (답을 구하는 것보다 OP에 대한 질문이 더 많습니다. 예를 들어 그저 답을 찾았으므로, 한 걸음 더 내딛었습니다. 다시 한 번 번갈아 가며 ...) – abarnert

관련 문제