2016-07-14 101 views
2

我在通過for循環迭代之後努力對齊一些數據。我想每個for循環輸出一個單獨的列,但未能弄清楚如何完成這一點。我試過用end =''結尾來換行,但並沒有把下一列帶回頂端。你能幫忙嗎?下面是我試圖構建的代碼的可測試示例。非常感謝您的幫助。Python並列打印列

import time, re, collections, operator 

output_list = [['2016-07-12', 'Magazine', 'News Paper #2', 'Podcast', '1234567', '10-10-10-10', 'ABCDEFG', 'Zoo'], 
['2016-07-12', 'Book', 'News Paper #2', 'Podcast', '1234567', '10-10-10-10', 'ABCDEFG', 'Zoo'], 
['2016-07-13', 'Book', 'News Paper #2', 'Podcast', '1234567', '10-10-10-10', 'ABREF', 'Zoo'], 
['2016-07-14', 'Article', 'News Paper #4', 'Radio', '1234567', '10-10-10-10', 'ABCDEFG', 'Zoo'], 
['2016-07-15', 'Article', 'News Paper #4', 'Radio', '1234567', '10-10-10-10', 'ABCDEFG', 'Zoo'], 
['2016-07-15', 'Snippet', 'News Paper #2', 'Podcast', '1234567', '10-10-10-10', 'ABCDEFG', 'Zoo']] 


def count_types(): 
    #item_1 = mm_counts(0) 
    item_2 = mm_counts(1) 
    item_3 = mm_counts(2) 
    item_4 = mm_counts(3) 
    item_5 = mm_counts(4) 
    item_6 = mm_counts(5) 
    item_7 = mm_counts(6) 
    item_8 = mm_counts(7) 

print('=' * 90) 
print(('Media1 Media2 Media3 Media4 Media5 Media6 Media7')) 
print('=' * 90) 
def mm_counts(a): 
    r = [] 
    for i in output_list: 
     x = (i[a]) 
     r.append(x) 
    y = collections.Counter(r) 

    padding = 9 
    for k, v in sorted(y.items(), key=operator.itemgetter(1), reverse=True): 
     z = (str(k).ljust(13, ' ') + ' ' + (str(v).ljust(5, ' '))) 
     print (z) 

count_types() 

電流輸出:

========================================================================================== 
Media1 Media2 Media3 Media4 Media5 Media6 Media7 
========================================================================================== 
Article  2  
Book   2  
Snippet  1  
Magazine  1  
News Paper #2 4  
News Paper #4 2  
Podcast  4  
Radio   2  
1234567  6  
10-10-10-10 6  
ABCDEFG  5  
ABREF   1  
Zoo   6  

所需的輸出:

============================================================================================= 
Media1  Media2   Media3  Media4  Media5   Media6  Media7 
============================================================================================== 
Article 2 Magazine  1 Podcast 4 1234567 6 10-10-10-10 6 ABCDEFG 5 Zoo 6 
Book  2 News Paper #2 4 Radio 2    ABREF 1 
Snippet 1 News Paper #4 2  
Magazine 1 
+1

燦在打印之前,是否將所有數據最初存儲在'lists'中,然後將它們壓縮(或一起迭代)? –

+0

只要'從__future__導入print_function'並連續執行'print(「...」,end =「」)'不應該破壞行。 [如何在沒有換行符或空格的Python中打印?](http://stackoverflow.com/questions/493386/how-to-print-in-python-without-newline-or-space) – mhoff

+1

@MichaelHoff,我試過了但它只是打印一行中的所有行而不是列。如果它已經爲你工作,你可以請發佈修改後的代碼? – MBasith

回答

0

學習使用(的格式字符串).format方法。您可以指定字段長度,左/中/右對齊,小數位和/或數字值的前導零等等。 https://docs.python.org/3/library/string.html#formatspec

一個例子

>>> kvp = [('Newspaper', 47), ('TV', 192), ('Radio', 543)] 
>>> fs = '{0[0]:>10s} {0[1]:6d}' 
>>> ' '.join([ fs.format(kv) for kv in kvp ]) 
' Newspaper  47   TV 192   Radio 543 ' 

頗有幾分對那裏發生的。 fs是一個格式字符串。 {...}以格式字符串標記要格式化的項目。在大括號內,:之前的內容標識了格式化後的內容以及如何格式化它。 0[0]0[1].format方法(必須是可下標的)的第一個(僅此處)參數的第一個和第二個元素。 >10s意味着右對齊以10 6d的場寬度的字符串意味着在6

最後' '.join([ fs.format(kv) for kv in kvp ])場寬度十進制整數創建kvp(即字符串)的格式的元素的列表,並連接它們的所有四個它們之間有空格(但沒有四個前導或尾隨空格)。

(是的,這是部分答案。有人可以回答把正確的實體以正確的順序格式化成輸出所需的線,如果我誤解了「對齊」的問題)

+0

感謝您的回覆。我也嘗試過,如果值只有一個項目,它會使文本進入對齊狀態。但是,我通過多個值進行迭代,因此當每列有多個值時,它不會工作。 – MBasith

+0

這不是我用'.join'向你展示的嗎? 'kvp'是元組列表,列表的長度是任意的。每個元組通過'.format'變成一個(這裏是固定長度的)字符串,然後這些格式化的字符串連接在一起形成一行輸出。如果問題是如何將您的輸入數據重新排序爲例如'kvp',我完全沒有發現這個問題。再次強調不要格式化? – nigel222

+0

好的,對不起,我對Python非常陌生。這是我添加的內容,但並未完成將它們添加到列中。你能讓我知道我做錯了什麼。對於已排序(y.items(),key = operator.itemgetter(1),reverse = True)中的kv,'fs ='{0 [0]:> 10s} {0 [1]:6d}' print (''.join([fs.format(kv)]))' – MBasith