I have a long list of 100 unique (names don't repeat) key/value pairs which I'd like to print consolidated into two equal width columns.
- How do I get the next iteration's key/value? (i.e. How do I print two key/value pairs in the same iteration?)
- How do I get the pairs to print in two columns of 40 character width or the max width of the longest length of a pair?
Current loop:
for key in example:
print(f'{key}: {example[key]}')
Example dictionary:
example = {
'key0': 'val0',
'key1': 'val1',
'key2': 'val2',
'key3': 'val3',
'key4': 'val4',
'key5': 'val5'
}
Desired result:
key0: val0 key1: val1
key2: val2 key3: val3
key4: val4 key5: val5
CodePudding user response:
you can run over the list of keys two by two
keys = list(example.keys())
for i in range(0,len(keys),2):
key1 = keys[i]
key2 = keys[i 1]
print("%s:%s %s:%s"%(key1,example[key1],key2,example[key2]))
output:
key0:val0 key1:val1
key2:val2 key3:val3
key4:val4 key5:val5
CodePudding user response:
Please don't ask two different questions. I'll just answer how to loop over the dictionary the way you want. There are plenty of other questions that explain how to format into fixed-width fields.
Use itertools.islice()
to slice the odd and even elements of the dictionary, then use zip()
to pair them up.
from itertools import islice, zip_longest
for (key1, value1), (key2, value2) in \
zip_longest(islice(example.items(), 0, None, 2),
islice(example.items(), 1, None, 2),
fillvalue = (None, None)):
if key2 is not None:
print(f'{key1}: {value1} {key2: value2}')
else:
print(f'{key1}: {value1}')
CodePudding user response:
This works:
example = {
"key0": "val0",
"key1": "val1",
"key2": "val2",
"key3": "val3",
"key4": "val4",
"key5": "val5",
}
max_width = max([len(f"{k}: {v}") for k, v in example.items()])
column_width = max(40, max_width)
keys = list(example.keys())
values = list(example.values())
for i in range(0, len(keys) - 1, 2):
left_key = keys[i]
right_key = keys[i 1]
left_value = values[i]
right_value = values[i 1]
n_spaces = column_width - len(f"{left_key}: {left_value}")
print(f"{left_key}: {left_value}" " " * n_spaces f"{right_key}: {right_value}")
CodePudding user response:
Another method:
from itertools import zip_longest
i = iter(example.items())
for col1, col2 in zip_longest(i, i):
col1 = f"{col1[0]}: {col1[1]}"
col2 = f"{col2[0]}: {col2[1]}" if col2 else ""
print(f"{col1:<40} {col2:<40}")
Prints:
key0: val0 key1: val1
key2: val2 key3: val3
key4: val4 key5: val5
CodePudding user response:
If you want to print formatted data to the console, maybe use the rich library?
from rich.console import Console
from rich.table import Table
from itertools import zip_longest
console = Console()
table = Table(show_header=False)
lst = iter(example.items())
for (k1, v1), (k2, v2) in zip_longest(lst, lst, fillvalue=("", "")):
table.add_row(k1, v1, k2, v2)
console.print(table)
output (looks even better on an actual console...):
┏━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┓
┃ key0 ┃ val0 ┃ key1 ┃ val1 ┃
│ key2 │ val2 │ key3 │ val3 │
│ key4 │ val4 │ key5 │ val5 │
│ key6 │ val6 │ │ │
└──────┴──────┴──────┴──────┘