2015-12-02 74 views
1

我需要一個項目的幫助,其中有一個項目列表中有25個項目。我如何打印,以便每5個項目跳過一行。如果我有這樣的:在列表中打印不同行中的多個項目

myList = [] 
    for i in range (1,25): 
     myList.append(i) 

我已經看了'\n'print(myList, end='')但我還沒有得到任何地方。我想要一個像這樣的最終結果:

1 2 3 4 5 
    6 7 8 9 10 
    11 12 13 14 15 
    16 17 18 19 20 
    21 22 23 24 25 

非常感謝。

+1

你只打印數字或任何物體?你還需要二維矩陣作爲結果還是隻需要輸出? –

+0

這基本上是一個FizzBu​​zz問題。 – SuperBiasedMan

+0

你應該閱讀關於join()和format()函數。 – Jonarz

回答

2

要有一個從1到25的列表,你需要做range(1, 26)。除此之外,你可以做你要求的格式打印:

numbers = range(1, 26) 
for i, elem in enumerate(numbers): 
    if i % 5 == 0: 
     print() 
    print(str(elem).ljust(3), end='') 
print() 

輸出:

1 2 3 4 5 
6 7 8 9 10 
11 12 13 14 15 
16 17 18 19 20 
21 22 23 24 25 

enumerate(list)返回一對(index, element)列表中的每一個元素。 str.ljust(n)將字符串左對齊,使其長度爲n,用空格填充其餘字符。

編輯:可替代地,如在意見提出@ PM_2Ring:

numbers = range(1, 26) 
for i, elem in enumerate(numbers, 1): 
    print(str(elem).ljust(3), end='\n' if i % 5 == 0 else '') 

作爲替代str(elem).ljust(3)還可以使用'{:<3}'.format(elem)(Python的2.7+)或'{0:<3}'.format(elem)(Python的< 2.7)

+1

或者,提供一個1的啓動參數枚舉:'enumerate(numbers,1)',然後你可以用條件表達式計算print'end' arg:'end ='\ n'if i%5 == 0其他'''。然後打印調用變成:'print(str(elem).ljust(3),end = end)'或'print('{0:<3}'.format(elem),end = end)';格式字符串可以簡化爲Python 2.7+中的「{:<3}」。 –

+0

感謝您的替代解決方案,我已將它添加到答案! –

-1
from math import sqrt 

r = range(25) 
n =int(sqrt(len(r))) 

for i in xrange(0,n): 
    print "\t".join([str(s) for s in r[i*n:i*n+n]]) 
+1

矯枉過正,代碼不可讀 –

+1

爲了獲得'sqrt'函數,不需要導入'math';只需使用效率更高的電力運營商'** 0.5'。但是,計算平方根在這裏可能是不必要的:我們可以假定板上的行數和列數是給定的。 –

0

循環遍歷每五個元素並添加中間數字:

for y in range(1, 26, 5): 
    print "\t{0}\t{1}\t{2}\t{3}\t{4}".format(y, y+1, y+2, y+3, y+4) 

對於每行多個項目的雙循環更容易:

for y in range(1, 26, 5): 
    for x in range(y, y+5): 
     out += "\t" + str(x) 
    out += "\n" 
print out 

我這裏使用的製表符,但你也可以使用字符串ljust功能。

0

使用一些地圖:

myList = range(1, 26) 
for line in map(lambda x: myList[x:x+5], range(0, len(myList), 5)): 
    print '\t'.join(map(str, line)) 

1 2 3 4 5 
6 7 8 9 10 
11 12 13 14 15 
16 17 18 19 20 
21 22 23 24 25 
1
for i in range(len(myList)/5+1): 
    print " ".join([str(j) for j in myList[5*i:5*i+5]]) 
1

你可以使用數組,因爲你可以很容易地重塑他們進入你的板尺寸:

import numpy as np 
array = np.arange(1,26) 
array = array.reshape((5,5)) 

for line in range(0,5): 
    print ' '.join(map(str, array[line,:])) 
+0

對於OP,使用numpy可能有些過於先進。 OTOH,你的代碼(可能)比我的一行代碼更容易理解。 :) –

1

只是爲了好玩,這裏是一個高深莫測的功能一個-liner:

print('\n'.join(map(''.join, zip(*[iter(map('{0:>3}'.format, myList))] * 5)))) 

N儘管這看起來很酷(對一些讀者來說),但是這種密集的嵌套代碼實際上並不推薦用於真正的程序中。

這裏本質上是相同的算法拆分,使其更具可讀性,與map調用轉換爲一個列表理解的一個:

strings = map('{0:>3}'.format, myList) 
chunked = zip(*[iter(strings)] * 5) 
rows = [''.join(s) for s in chunked] 
print '\n'.join(rows) 

該算法的最棘手的部分是zip(*[iter(strings)] * 5)[iter(strings)] * 5部分通過strings迭代器創建一個迭代器的5個引用列表。 * splat運算符將這些引用作爲單獨的參數傳遞給zipzip然後創建長度爲5的元組,依次從其每個參數中繪製以填充元組。但是它的每個參數都是對迭代器的相同iter(strings)的引用,因此該迭代器的內容被打包成元組。