example-code-2e/17-it-generator/columnize_iter.py

28 lines
831 B
Python
Raw Normal View History

# tag::COLUMNIZE[]
2021-08-25 19:46:57 +02:00
from collections.abc import Sequence, Iterator
2021-08-25 19:46:57 +02:00
def columnize(
sequence: Sequence[str], num_columns: int = 0
) -> Iterator[tuple[str, ...]]: # <1>
if num_columns == 0:
2021-08-25 19:46:57 +02:00
num_columns = round(len(sequence) ** 0.5)
num_rows, reminder = divmod(len(sequence), num_columns)
num_rows += bool(reminder)
2021-08-25 19:46:57 +02:00
return (tuple(sequence[i::num_rows]) for i in range(num_rows)) # <2>
# end::COLUMNIZE[]
def demo() -> None:
2021-08-25 19:46:57 +02:00
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 row in columnize(nato, 4):
for word in row:
print(f'{word:15}', end='')
print()
if __name__ == '__main__':
demo()