1

我正在尝试在垂直排序的列中显示一个列表,其中的列数由用户决定。我想使用zip(),但我似乎无法弄清楚如何告诉它不通过n列表。

#!/usr/bin/env python

import random

lst = random.sample(range(100), 30)
lst = sorted(lst)

col_size = int(raw_input('How many columns do you want?: '))
sorting = 'Vertical'

if sorting == 'Vertical':
    # vertically sorted
    columns = []
    n = len(lst)//col_size

    for i in range(0, len(lst), n):
        columns.append(lst[i:i+n])

    print '\nVertically Sorted:'

    print columns
    print zip(*columns)

这给出了这个结果:

How many columns do you want?: 4

Vertically Sorted:
[[0, 2, 4, 11, 12, 16, 23], [24, 31, 32, 36, 41, 48, 50], [52, 54, 61, 62, 63, 64, 67], [76, 80, 81, 89, 91, 92, 94], [96, 97]]
[(0, 24, 52, 76, 96), (2, 31, 54, 80, 97)]

如果我知道列数(例如 4),我可以编写:

for c1, c2, c3, c4 in zip(columns[0], columns[1], columns[2], columns[3]):
    print str(c1), str(c2).rjust(8), str(c3).rjust(8), str(c4).rjust(8)

但既然我没有,我该如何使用zip?如您所见,我尝试过zip(*columns),但由于不相等而失败。最后一个列表中的项目。

4

3 回答 3

1

Zip 无法满足您的需求,因为行的大小不同。当行不均匀时,地图将转置。

请参阅在 python 中创建漂亮的列输出中的代码帮助。

程序

随机导入

lst = 随机样本(范围(100),30) lst = 排序(lst)

col_size = int(raw_input('你想要多少列?:')) 排序 = '垂直'

ifsorting == 'Vertical': # 垂直排序的列 = [] n = len(lst)//col_size

for i in range(0, len(lst), n):
    columns.append(lst[i:i+n])

print '\nColumns:'
columns = map(None,*columns)
print columns
print '\nVertically Sorted:'

col_width = max(len(str(word)) for row in columns for word in row) + 2  # padding
for row in columns:
  print "".join(str(word).ljust(col_width) for word in row if word is not None)

输出

How many columns do you want?: 4

Columns:
[(0, 19, 45, 62, 92), (1, 24, 47, 64, 93), (5, 29, 48, 72, None), (6, 31, 50, 80, None), (9, 34, 56, 85, None), (14, 36, 58, 87, None), (15, 37, 61, 90, None)]

Vertically Sorted:
0     19    45    62    92
1     24    47    64    93
5     29    48    72
6     31    50    80
9     34    56    85
14    36    58    87
15    37    61    90
于 2013-07-28T21:35:54.953 回答
0

在从结果中删除 None 元素后,使用 None 元素扩展最后一个列表以获得相等的长度、zip。

于 2013-07-28T21:59:30.783 回答
0

使用石斑鱼食谱 IT.izip_longest(*[iterable]*n)将物品收集lst到大小不同的组中n。(有关石斑鱼食谱如何工作的更详细说明,请参阅此页面。)

import random
import itertools as IT
# lst = random.sample(range(100), 30)
lst = range(30)
lst = sorted(lst)

col_size = int(raw_input('How many columns do you want?: '))
sorting = 'Vertical'

if sorting == 'Vertical':
    # vertically sorted
    n = len(lst)//col_size
    lst = iter(lst)
    columns = IT.izip_longest(*[lst]*n, fillvalue='')

    print '\nVertically Sorted:'

    print('\n'.join(
        [''.join(map('{:4}'.format, row))
         for row in IT.izip(*columns)]))

产量

   0   7  14  21  28
   1   8  15  22  29
   2   9  16  23    
   3  10  17  24    
   4  11  18  25    
   5  12  19  26    
   6  13  20  27    
于 2013-07-28T21:41:02.247 回答