如何垂直显示列表?

时间:2014-03-09 22:29:47

标签: python string list python-3.x

我有一个字母列表,希望能够像这样垂直显示:

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

8 个答案:

答案 0 :(得分:9)

那是因为你是printing他们分开的。虽然你没有给我们足够的关于 实际上你想要打印它们的信息,但我可以推断出你想要第一列的前半部分和第二列的后半部分。

嗯,这不是那么容易,你需要提前考虑并意识到如果你计算列表的一半并保留它: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,但如果两个迭代都不是',则填充默认值' t大小相同。

希望这有帮助!

答案 1 :(得分:3)

我只想提出另一种解决方案:

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

答案 2 :(得分: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 
>>> 

答案 3 :(得分:1)

如果目标是指定显示集合的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

答案 4 :(得分:0)

如果没有上下文,你很难提供答案。

如果您的数据需要成对,那么您可能应该创建一个结构不同的对象。一个简单的例子就是元组列表。

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

答案 5 :(得分:0)

对于一般解决方案,您可以按照以下方式执行操作:

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({2}为{2}),您可以提供填充值,并且不会截断奇数结束值。

如果要更改列,请更改行数:

izip_longest

打印:

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

当然,如果你有一个列表X项长,很容易计算出列和行之间的关系。

那么这是如何运作的?

根据定义,表格是一个矩阵。首先,创建一个a c e g i k m o b d f h j l n p 长的矩阵:

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

从那里开始......

答案 6 :(得分:0)

一种简单的方法是:D=["A","B","C"] 打印('\ n'.join(D))

答案 7 :(得分:0)

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