将n个列表压缩在一起

时间:2013-07-28 21:05:02

标签: python list

我正在尝试在垂直排序的列中显示列表,其中列数由用户决定。我想使用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),但由于不平等而失败了。最后一个清单中的项目。

3 个答案:

答案 0 :(得分:1)

Zip不会做你想要的事,因为行的大小不同。当行不均匀时,地图将进行转置。

请参阅以下Create nice column output in python的代码帮助。

PROGRAM

导入随机

lst = random.sample(范围(100),30) lst = sorted(lst)

col_size = int(raw_input('你想要多少列?:')) sorting ='Vertical'

如果排序=='垂直':     #垂直排序     columns = []     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

答案 1 :(得分:0)

使用the grouper recipe IT.izip_longest(*[iterable]*n)lst中的项目收集到大小为n的组中。 (有关石斑鱼食谱如何工作的更详细说明,请参阅this page。)

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    

答案 2 :(得分:0)

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