from typing import Sequence, List, Tuple, TypeVar T = TypeVar('T') def columnize(sequence: Sequence[T], num_columns: int = 0) -> List[Tuple[T, ...]]: if num_columns == 0: num_columns = round(len(sequence) ** .5) num_rows, reminder = divmod(len(sequence), num_columns) num_rows += bool(reminder) return [tuple(sequence[i::num_rows]) for i in range(num_rows)] def demo() -> None: nato = ('Alfa Bravo Charlie Delta Echo Foxtrot Golf Hotel India' ' Juliett Kilo Lima Mike November Oscar Papa Quebec Romeo' ' Sierra Tango Uniform Victor Whiskey X-ray Yankee Zulu' ).split() for line in columnize(nato): for word in line: print(f'{word:15}', end='') print() print() for length in range(2, 21, 6): values = list(range(1, length + 1)) for row in columnize(values): for cell in row: print(f'{cell:5}', end='') print() print() if __name__ == '__main__': demo()