簡體   English   中英

如何垂直顯示列表?

[英]How to display a list vertically?

我有一個字母列表,希望能夠像這樣垂直顯示它們:

a d
b e
c f

def main():
    letters = ["a", "b", "c", "d","e", "f"]
    for i in letters:
       print(i)

這段代碼只像這樣顯示它們:

a
b
c
d
e

那是因為您在單獨的行中打印它們。 盡管您沒有給我們足夠的信息來說明您實際上想要如何打印它們,但我可以推斷出您想要第一列的前半部分和第二列的后半部分。

嗯,這不是那么容易,您需要提前考慮一下並意識到如果您計算列表的一半並保留它: h=len(letters)//2您可以通過變量i遍歷前半部分列表和打印在同一行letters[i]letters[h+i]正確嗎? 像這樣的東西:

def main():
    letters = ["a", "b", "c", "d","e", "f"]
    h = len(letters)//2 # integer division in Python 3
    for i in range(h):
       print(letters[i], letters[h+i])

您可以輕松地將它概括為沒有對長度的列表,但這實際上取決於您在這種情況下想要做什么。

話雖如此,通過使用 Python,您可以走得更遠:)。 看看這段代碼:

def main():
    letters = ["a", "b", "c", "d","e", "f"]
    for s1,s2 in zip(letters[:len(letters)//2], letters[len(letters)//2:]): #len(letters)/2 will work with every paired length list
       print(s1,s2)

這將在 Python 3 中輸出以下內容:

a d
b e
c f

我剛剛做的是使用zip函數將列表的兩半分組的形式元組。

為了完整起見,如果有一天你的列表沒有一對長度,你可以使用itertools.zip_longest它或多或少像zip一樣工作,但如果兩個可迭代的大小不同,則填充默認值。

希望這可以幫助!

我只會提出另一個解決方案:

letters = ["a", "b", "c", "d","e", "f"]

for n,i in enumerate(letters[:3]):
    print(i,letters[n+3])

還輸出:

a d
b e
c f

回答 Peter Goldsborough 有問題

這個字母數組怎么樣

>>> letters = ["a", "b", "c", "d","e"]
>>> for n,i in enumerate(letters[:3]):
    print(i,letters[n+3])


a d
b e
Traceback (most recent call last):
  File "<pyshell#187>", line 2, in <module>
    print(i,letters[n+3])
IndexError: list index out of range

我為它添加了條件

>>> for n,i in enumerate(letters[:3]):
    if n + 3 < len(letters):
        print(i,letters[n+3])
    else:
        print(i)


a d
b e
c

Paulo Bu的回答也有同樣的問題。

這是我認為更簡單和通用的解決方案

>>> import math
>>> def main():
    letters = ["a", "b", "c", "d", "e", "f"]
    rows = 3
    columns = int(math.ceil(len(letters) / rows))
    for i in range(min(rows, len(letters))):
        for j in range(columns):
            next_column_i = i + rows * j
            if next_column_i < len(letters):
                print(letters[next_column_i], end = ' ')
        print()


>>> main()
a d 
b e 
c f 
>>> 

我可以更改行數將其設置為 2,如果需要,可以輕松獲得

>>> main()
a c e 
b d f 
>>> 

如果目標是指定顯示集合的 COLUMNS 數,這是我的代碼

# Python 3

from math import ceil

def pt(x, nbcol):
    print ('nbcol ==',nbcol)
    y = int(ceil(len(x)/float(nbcol)))
    wcol = len(x)//y
    if wcol==nbcol or (wcol+1==nbcol and 0 < len(x) - (wcol*y) <= y):
        print ('\n'.join('\t'.join(str(el) for el in x[i::y])
                         for i in range(y)) , '\n' )
    else:
        print ("I can't do it\n")


li = ['ab','R','uio','b',4578,'h','yu','mlp','AZY12','78']
for nbcol in range(1,9):
    pt(li,nbcol)
print ('===============================')
for nbcol in range(1,9):
    pt("abcdef",nbcol)
print ('===============================')
for nbcol in range(1,9):
    pt('abcdefghijk',nbcol)

例子

nbcol == 1
ab
R
uio
b
4578
h
yu
mlp
AZY12
78 

nbcol == 2
ab  h
R   yu
uio mlp
b   AZY12
4578    78 

nbcol == 3
ab  4578    AZY12
R   h   78
uio yu
b   mlp 

nbcol == 4
ab  b   yu  78
R   4578    mlp
uio h   AZY12 

nbcol == 5
ab  uio 4578    yu  AZY12
R   b   h   mlp 78 

nbcol == 6
I can't do it

nbcol == 7
I can't do it

nbcol == 8
I can't do it

===============================
nbcol == 1
a
b
c
d
e
f 

nbcol == 2
a   d
b   e
c   f 

nbcol == 3
a   c   e
b   d   f 

nbcol == 4
I can't do it

nbcol == 5
I can't do it

nbcol == 6
a   b   c   d   e   f 

nbcol == 7
I can't do it

nbcol == 8
I can't do it

===============================
nbcol == 1
a
b
c
d
e
f
g
h
i
j
k 

nbcol == 2
a   g
b   h
c   i
d   j
e   k
f 

nbcol == 3
a   e   i
b   f   j
c   g   k
d   h 

nbcol == 4
a   d   g   j
b   e   h   k
c   f   i 

nbcol == 5
I can't do it

nbcol == 6
a   c   e   g   i   k
b   d   f   h   j 

nbcol == 7
I can't do it

nbcol == 8
I can't do it

如果沒有你正在做的事情的背景,就很難提供答案。

如果您的數據需要成對出現,那么您或許應該創建一個不同結構的對象。 一個簡單的例子是元組列表。

def main():
    letters = [("a", "d"), ("b", "e"), ("c", "f")]
    for pair in letters:
       print("%s %s" % pair)

對於通用解決方案,您可以按照以下方式進行操作:

from itertools import zip_longest

lets = list('abcdefghijklmnop')

def table(it, rows):
    return zip_longest(*[it[i:i+rows] for i in range(0, len(it), rows)], 
                            fillvalue=' ')

for t in table(lets, 6):
    print(*t) 

印刷:

a g m
b h n
c i o
d j p
e k 
f l 

由於我們使用的是zip_longest (Python 2 的izip_longest ),您可以提供一個填充值並且奇數結束值不會被截斷。

如果要更改列,請更改行數:

for t in table(lets, 2):
    print(*t)  

印刷:

a c e g i k m o
b d f h j l n p

當然,如果您有一個長 X 項的列表,那么計算 cols 和 rows 之間的關系很容易。

那么這是如何工作的呢?

根據定義,表是一個矩陣。 因此,首先創建一個矩陣就是rows長:

>>> lets
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p']
>>> rows=6
>>> [lets[i:i+rows] for i in range(0, len(lets), rows)]
[['a', 'b', 'c', 'd', 'e', 'f'], ['g', 'h', 'i', 'j', 'k', 'l'], ['m', 'n', 'o', 'p']]

然后反轉該矩陣:

>>> for t in zip_longest(*[lets[i:i+rows] for i in range(0, len(lets), rows)]):
...     print(t)
... 
('a', 'g', 'm')
('b', 'h', 'n')
('c', 'i', 'o')
('d', 'j', 'p')
('e', 'k', None)
('f', 'l', None)

然后從那里走...

一個簡單的方法是: D=["A","B","C"] print('\\n'.join(D))

>>> letters = ["a", "b", "c", "d", "e", "f", "g"]
>>> odd_even = zip(letters[::2], letters[1::2] + len(letters) % 2 * [""])
>>> pairs = [" ".join([odd, even]) for odd, even in odd_even]
a b
c d
e f
g

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM