В качестве расширения @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.
Второй он принимает количество столбцов и делит пополам, увеличивая до восьмого. Это будет использоваться для сравнения самой длинной строки в списке, чтобы определить количество столбцов, наиболее подходящих для этого.
Третий - самая длинная строка списка, извлекаемая с помощью функции max (), встроенной в python.
Forth длина самой длинной строки берется и затем добавляется к ней для заполнения. Длина списка также принимается за то, чтобы, если список меньше 8 элементов, в нем было указано только количество элементов, которые существуют.
Пятая самая длинная длина строки сравнивается с каждым из оконечных пространств от одного столбца до восьми. Если столбец больше или равен длине, его можно использовать. Например, самая длинная строка равна 10, а столбцы, разделенные на восемь (Terminal_space_eighth), равны 8, а столбцы, разделенные на семь (Terminal_space_seventh), равны 12, будет семь столбцов. Их будет семь, потому что самая длинная строка может уместиться в 12 символов, но не в 8 символов.
Стоит также отметить, что длина списка учитывается, чтобы предотвратить создание большего количества столбцов, чем элементов списка.
Шестое - это расширение объяснения @Aman: https://stackoverflow.com/a/1524132/11002603
Индексация
Позвольте мне представить число, определенное размером терминала для примера.
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 в соответствующие столбцы, и здесь определяется длина каждого столбца. Длина основана на длине строки, определенной выше.