Als Erweiterung von @Aman folgt eine Funktion, die eine Liste von Zeichenketten annimmt und sie in Spalten basierend auf der Terminalgröße ausgibt.
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)
Zur Erläuterung: Es gibt verschiedene Möglichkeiten.
Erste wird die Anzahl der Spalten für das Terminal des aktuellen Benutzers mit os.popen ermittelt.
Zweite wird die Anzahl der Spalten halbiert und auf ein Achtel erhöht. Damit wird die längste Zeichenkette in der Liste verglichen, um die Anzahl der dafür am besten geeigneten Spalten zu ermitteln.
Dritte ist die längste Zeichenkette der Liste, die mit der eingebauten Python-Funktion max() gezogen wurde.
Forth wird die Länge der längsten Zeichenkette genommen und dann um eins aufgefüllt. Die Länge der Liste wird ebenfalls übernommen, so dass bei einer Liste mit weniger als 8 Einträgen nur die Anzahl der vorhandenen Einträge aufgeführt wird.
Fünfte wird die längste Zeichenkettenlänge mit jedem der terminalen Leerzeichen von einer bis acht Spalten verglichen. Wenn die Spalte größer oder gleich der Länge ist, kann sie verwendet werden. Wenn zum Beispiel die längste Zeichenkette 10 ist und die Spalten geteilt durch acht (terminal_space_eighth) 8 sind, aber die Spalten geteilt durch sieben (terminal_space_seventh) 12 sind, gibt es sieben Spalten. Es werden sieben sein, weil die längste Zeichenkette in 12 Zeichen passt, aber nicht in 8 Zeichen.
Es ist auch erwähnenswert, dass die Länge der Liste berücksichtigt wird, um zu verhindern, dass mehr Spalten als Listenelemente erstellt werden.
Sechste ist eine Erweiterung der Erklärung von @Aman : https://stackoverflow.com/a/1524132/11002603
Indizierung Für dieses Beispiel soll i die Zahl sein, die durch die Größe des Terminals bestimmt wird. input_list[::i]
Dies wählt das Element bei i aus. Durch Hinzufügen einer Zahl am Anfang wie input_list[1::i]
verschiebt den Startpunkt (denken Sie daran, dass Python 0 als gültige Zahl betrachtet, weshalb sie anfangs nicht verwendet wird).
Zipping
Zip wird verwendet, um ein Tupel mit Elementen einer Liste zu erstellen. Die Ausgabeliste sieht zum Beispiel wie folgt aus
zip([string1,string2,string3], [string4,string5, string6], [string7,string8,string9])
output : [(string1,string4,string7), (string2,string5, string8), (string3,string6,string9)]
Gemeinsam nutzen Je nach Anzahl der Spalten werden die Buchstaben nur zur Darstellung einer Aufteilung verwendet. Wenn also zum Beispiel nur 5 Spalten in das Terminal passen, wird Folgendes verwendet
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]):
Dabei werden die beim Zippen erzeugten Tupel als Variablen a, b, c, d und e gespeichert, so dass wir sie in der Schleife aufrufen können.
Der Spaltenraum wird dann für die Formatierung von a, b, c, d und e in die jeweiligen Spalten verwendet, und hier wird die Länge jeder Spalte bestimmt. Die Länge basiert auf der oben ermittelten Länge der Zeichenfolge.
1 Stimmen
Erstens ist es keine gute Idee, dict als Variablennamen zu verwenden. Zweitens ist das, was Sie hier zu drucken versuchen, eine Liste, ein dict verwendet {} und :, um die Schlüssel und Werte zu trennen
3 Stimmen
-1: Im Titel der Frage steht "Liste" - eine komplette Verdoppelung. In der Frage steht "dict". Der Beispielcode ist eine Liste - eine komplette Verdoppelung. Möchten Sie, dass die Liste in ein Diktat umgewandelt und ausgedruckt wird? Wenn ja, ändern Sie die Frage, um zu beschreiben, was Sie vraiment wollen.
0 Stimmen
Ich habe die Beschreibung und den Beispielcode wie empfohlen korrigiert. Der Titel und die Beschreibung spiegeln jetzt mein Ziel wider. Vielen Dank für die Korrekturen.
0 Stimmen
Wenn die Herabstufungen auf die anfängliche Verwirrung und die schlechte Formulierung zurückzuführen waren, nehmen Sie sie bitte zurück, da dies inzwischen behoben wurde. Wenn die Herabstufungen aus einem anderen Grund erfolgten, erklären Sie mir bitte, dass ich den Fehler beheben oder zumindest nicht noch einmal machen kann. Ich danke Ihnen.
0 Stimmen
Zu Downvotes: Downvoteure erhalten nach der Abstimmung keine Benachrichtigung über Kommentare :(
0 Stimmen
Re downvotes: Oh. Das ist bedauerlich. Ich kann die Logik, die zu dieser Funktion führt, nachvollziehen, aber es macht es Anfängern schwer, aus dem Loch herauszukommen. Danke für den Hinweis, sonst hätte ich weiterhin schlecht über S. Lott gedacht, weil er es ignoriert hat.
1 Stimmen
Im Jahr 2021 empfehle ich Ihnen, die Antworten von Claudio y Epischer Wink für ihre Verwendung von
columnize
.0 Stimmen
Danke @CameronSmith. Epic Wink's ist direkt und kurz genug, um die akzeptierte Antwort zu ändern, für py3.