I'm trying to define a function which takes an array and prints it to a predefined total width in as many columns as needed. Think of the way ls
prints files for example.
Here is the kind of output I am looking for:
$ ./print-columns.py Files /home/stephen/dev/src/cmake-browser/cmakeclient.cpp /home/stephen/dev/src/cmake-browser/projectsources.cpp /home/stephen/dev/src/cmake-browser/main.cpp /home/stephen/dev/src/cmake-browser/includesmodel.cpp /home/stephen/dev/src/cmake-browser/mainwindow.cpp /home/stephen/dev/src/cmake-browser/definesmodel.cpp /home/stephen/dev/src/cmake-browser/debugwidget.cpp /home/stephen/dev/src/cmake-browser/highlighter.cpp /home/stephen/dev/src/cmake-browser/projecttree.cpp /home/stephen/dev/src/cmake-browser/helpviewer.cpp /home/stephen/dev/src/cmake-browser/projectmodel.cpp /home/stephen/dev/src/cmake-browser/main.cpp /home/stephen/dev/src/cmake-browser/projectcode.cpp /home/stephen/dev/src/cmake-browser/helpviewer.cpp /home/stephen/dev/src/cmake-browser/projectdetail.cpp Targets KF5ItemModels kdescendantsproxymodel_smoketest klinkitemselectionmodeltest krecursivefilterproxymodeltest kselectionproxymodel_smoketest kselectionproxymodeltest proxymodeltestapp proxymodeltestsuite testmodelqueuedconnections
I created the following script to do that. I'm trying to brush up on my Python, and re-learn how to write pythonic code in the most modern way (latest Python 3), and it doesn't feel very pythonic (and it's not the kind of code I usually write).
#!/usr/bin/env python3
import sys, subprocess, json, math
def col_print(title, array):
print()
print()
print(title)
indent = " " * 4
if not array:
print(indent + "<None>")
return
padsize = 1
# Hardcoded for this example
termwidth = 150
maxitemwidth = len(max(array, key=len))
numCols = int((termwidth + padsize) / (maxitemwidth + padsize))
numRows = int(math.ceil(len(array) / float(numCols)))
pad = " " * padsize
for index in range(numRows):
print(indent + pad.join(item.ljust(maxitemwidth) for item in array[index::numRows]))
col_print("Files",
["/home/stephen/dev/src/cmake-browser/cmakeclient.cpp",
"/home/stephen/dev/src/cmake-browser/main.cpp",
"/home/stephen/dev/src/cmake-browser/mainwindow.cpp",
"/home/stephen/dev/src/cmake-browser/debugwidget.cpp",
"/home/stephen/dev/src/cmake-browser/projecttree.cpp",
"/home/stephen/dev/src/cmake-browser/projectmodel.cpp",
"/home/stephen/dev/src/cmake-browser/projectcode.cpp",
"/home/stephen/dev/src/cmake-browser/projectdetail.cpp",
"/home/stephen/dev/src/cmake-browser/projectsources.cpp",
"/home/stephen/dev/src/cmake-browser/includesmodel.cpp",
"/home/stephen/dev/src/cmake-browser/definesmodel.cpp",
"/home/stephen/dev/src/cmake-browser/highlighter.cpp",
"/home/stephen/dev/src/cmake-browser/helpviewer.cpp",
"/home/stephen/dev/src/cmake-browser/main.cpp",
"/home/stephen/dev/src/cmake-browser/helpviewer.cpp"]
)
col_print("Targets",
["KF5ItemModels",
"krecursivefilterproxymodeltest",
"proxymodeltestapp",
"kdescendantsproxymodel_smoketest",
"kselectionproxymodel_smoketest",
"proxymodeltestsuite",
"klinkitemselectionmodeltest",
"kselectionproxymodeltest",
"testmodelqueuedconnections"]
)
Can you help write a better col_print
function?