作为@Aman 的扩展,下面是一个函数,它接受一个字符串列表并根据终端大小在列中输出它们。
import os
def column_display(input_list):
'''
Used to create a structured column display based on the users terminal size
input_list : A list of string items which is desired to be displayed
'''
rows, columns = os.popen('stty size', 'r').read().split()
terminal_space_eighth = int(columns)/8
terminal_space_seventh = int(columns)/7
terminal_space_sixth = int(columns)/6
terminal_space_fifth = int(columns)/5
terminal_space_quarter = int(columns)/4
terminal_space_third = int(columns)/3
terminal_space_half = int(columns)/2
longest_string = max(input_list, key=len)
longest_length = len(longest_string) + 1
list_size = len(input_list)
if longest_length > terminal_space_half:
for string in input_list:
print(string)
elif terminal_space_eighth >= longest_length and list_size >= 8:
for a,b,c,d,e,f,g,h in zip(input_list[::8],input_list[1::8],input_list[2::8], input_list[3::8], input_list[4::8], input_list[5::8], input_list[6::8], input_list[7::8]):
column_space = '{:<%s}{:<%s}{:<%s}{:<%s}{:<%s}{:<%s}{:<%s}{:<}' % (longest_length, longest_length, longest_length, longest_length, longest_length, longest_length, longest_length )
output = column_space.format(a,b,c,d,e,f,g,h)
print(output)
elif terminal_space_seventh >= longest_length and list_size >= 7:
for a,b,c,d,e,f,g in zip(input_list[::7],input_list[1::7],input_list[2::7], input_list[3::7], input_list[4::7], input_list[5::7], input_list[6::7]):
column_space = '{:<%s}{:<%s}{:<%s}{:<%s}{:<%s}{:<%s}{:<}' % (longest_length, longest_length, longest_length, longest_length, longest_length, longest_length)
output = column_space.format(a,b,c,d,e,f,g)
print(output)
elif terminal_space_sixth >= longest_length and list_size >= 6:
for a,b,c,d,e,f in zip(input_list[::6],input_list[1::6],input_list[2::6], input_list[3::6], input_list[4::6], input_list[5::6]):
column_space = '{:<%s}{:<%s}{:<%s}{:<%s}{:<%s}{:<}' % (longest_length, longest_length, longest_length, longest_length, longest_length)
output = column_space.format(a,b,c,d,e,f)
print(output)
elif terminal_space_fifth >= longest_length and list_size >= 5:
for a,b,c,d,e in zip(input_list[::5],input_list[1::5],input_list[2::5], input_list[3::5], input_list[4::5]):
column_space = '{:<%s}{:<%s}{:<%s}{:<%s}{:<}' % (longest_length, longest_length, longest_length, longest_length)
output = column_space.format(a,b,c,d,e)
print(output)
elif terminal_space_quarter >= longest_length and list_size >= 4:
for a,b,c,d in zip(input_list[::4],input_list[1::4],input_list[2::4], input_list[3::4]):
column_space = '{:<%s}{:<%s}{:<%s}{:<}' % (longest_length, longest_length, longest_length)
output = column_space.format(a,b,c,d)
print(output)
elif terminal_space_third >= longest_length and list_size >= 3:
for a,b,c in zip(input_list[::3],input_list[1::3],input_list[2::3]):
column_space = '{:<%s}{:<%s}{:<}' % (longest_length, longest_length)
output = column_space.format(a,b,c)
print(output)
elif terminal_space_half >= longest_length and list_size >= 2:
for a,b in zip(input_list[::2],input_list[1::2]):
column_space = '{:<%s}{:<}' % longest_length
output = column_space.format(a,b)
print(output)
作为解释,它做了一些不同的事情。
首先它使用 os.popen 获取当前用户终端的列数。
秒它取列数并分成两半,增加到八分之一。这将用于比较列表中最长的字符串,以确定最适合此的列数。
第三个是使用内置 python 函数 max() 拉出的列表中最长的字符串。
Forth 取最长字符串的长度,然后添加一个用于填充。列表的长度也是如此,因此如果列表少于 8 个项目,它将仅列出存在的项目数。
第五最长的字符串长度与从一列到八列的每个终端空间进行比较。如果列大于或等于长度,则可以使用它。例如,最长的字符串是 10,列除以 8(terminal_space_eighth) 是 8,但列除以 7(terminal_space_seventh) 是 12,将有 7 列。将有 7 个,因为最长的字符串可以容纳 12 个字符,但不能容纳 8 个字符。
还值得注意的是,要考虑列表的长度,以防止创建的列多于列表项。
Sixth 是@Aman 解释的扩展:https://stackoverflow.com/a/1524132/11002603
索引
为了这个例子,让 i 表示由终端大小确定的数字。
input_list[::i] 这会选择 i 处的元素。在前面添加一个数字,例如 input_list[1::i] 会偏移起点(请记住,python 认为 0 是一个有效数字,这就是它最初不使用的原因。)
压缩
Zip 用于创建包含列表元素的元组。例如,输出列表将如下所示
zip([string1,string2,string3], [string4,string5, string6], [string7,string8,string9])
output : [(string1,string4,string7), (string2,string5, string8), (string3,string6,string9)]
一起使用
根据列数,字母仅用于表示拆分。因此,例如,如果终端中只有 5 列,将使用以下内容
for a,b,c,d,e in zip(input_list[::5],input_list[1::5],input_list[2::5], input_list[3::5], input_list[4::5]):
这将获取通过压缩创建的元组,然后存储为 a、b、c、d 和 e 变量,以便我们可以在循环中调用它们。
列空间随后用于将 a、b、c、d 和 e 中的每一个格式化为各自的列,并且是确定每列长度的地方。长度基于上面确定的字符串长度。