2013-05-19 53 views
0

我有幾個包含字符串和浮點數的列表作爲它們的元素。如何在Python中使用numpy.savetxt居中對齊不同長度的列?

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')) 

輸出運行此文件時,我得到的是以下幾點:

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 

我怎麼能拿像這樣的輸出(帶有對齊的標題),如果字符串沒有定義最大寬度。我已經嘗試修改字符串(fmt)的格式,但至今沒有運氣。

- 謝謝!

回答

1

你需要(取決於你如何看待它或輸入),這類似於

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

的方法將實現來計算你的輸出最長行的最大字符串長度。之後,你需要根據MAX_LEN的價值,你可以做像這樣來動態改變fmt參數:

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

以下非numpy的例子顯示了預期輸出:

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') 

產生一個文本文件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

這正是我一直在尋找的!謝謝@HennyH – Victor

+0

你不需要像這樣手動鏈接格式化方法;只需使用嵌套格式。例如,'{1:^ {0}}'。格式('%s',max_len)'。即使你想要手動鏈接它們,爲什麼要在'%'格式化和'{}'格式之間切換呢? (這對OP來說更像是一個問題,而不是回答者的問題,因爲你只是遵循他的例子,但你已經走得更遠了,再交替一次,所以......) – abarnert

相關問題