我正在尝试在垂直排序的列中显示列表,其中列数由用户决定。我想使用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)
,但由于不平等而失败了。最后一个清单中的项目。
答案 0 :(得分:1)
Zip不会做你想要的事,因为行的大小不同。当行不均匀时,地图将进行转置。
请参阅以下Create nice column output in python的代码帮助。
导入随机
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,从结果中删除无元素。