如何垂直显示列表?

8 投票
9 回答
77938 浏览
提问于 2025-04-17 21:34

我有一串字母,想把它们竖着显示,像这样:

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

9 个回答

1

如果你的目标是指定要显示集合的列数,这里是我的代码

# 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
1

回答: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 
>>> 
4

我再提供一个解决方案:

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
6

一个简单的方法是:

D=["A","B","C"] print('\n'.join(D))

这里的意思是,首先我们创建了一个叫做D的列表,里面有三个字母"A"、"B"和"C"。然后,使用`print`这个命令把它们打印出来。`'\n'.join(D)`的作用是把列表里的内容用换行符连接起来,这样每个字母就会在新的一行显示。

9

这是因为你把它们打印在了不同的行上。虽然你没有告诉我们你具体想怎么打印,但我可以推测你想把前半部分放在第一列,后半部分放在第二列。

其实这并不简单,你需要提前想一下。如果你先计算出列表的中间位置并保存它: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差不多,但如果两个列表的长度不一样,它会用默认值填充。

希望这对你有帮助!

撰写回答