PAS
PAS

Reputation: 159

most pythonic may to pass a nested list into formatting

What's the best way to pass this:

board = [['X','o','o','o','o','X'],
['X','o','o','_','_','X'],
['X','o','o','_','_','X'],
['X','o','o','o','X','X'],
['X','o','o','o','X','X'],
['X','o','o','_','X','X'],
['_','o','o','o','X','X']]

into this:

"""
    ╔═══╦═══╦═══╦═══╦═══╦═══╦═══╗
    ║ {} ║ {} ║ {} ║ {} ║ {} ║ {} ║ {} ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ {} ║ {} ║ {} ║ {} ║ {} ║ {} ║ {} ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ {} ║ {} ║ {} ║ {} ║ {} ║ {} ║ {} ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ {} ║ {} ║ {} ║ {} ║ {} ║ {} ║ {} ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ {} ║ {} ║ {} ║ {} ║ {} ║ {} ║ {} ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ {} ║ {} ║ {} ║ {} ║ {} ║ {} ║ {} ║
    ╚═══╩═══╩═══╩═══╩═══╩═══╩═══╝

    """

With formatting? Note: the lists are vertical based in the board definition, so a simple for loop won't work.

Upvotes: 1

Views: 40

Answers (1)

TigerhawkT3
TigerhawkT3

Reputation: 49330

Assuming board is the board and fmt is that format string, unpack it with * after you flatten it using any method you like, such as a generator expression:

>>> print(fmt.format(*(item for row in board for item in row)))

    ╔═══╦═══╦═══╦═══╦═══╦═══╦═══╗
    ║ X ║ o ║ o ║ o ║ o ║ X ║ X ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ o ║ o ║ _ ║ _ ║ X ║ X ║ o ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ o ║ _ ║ _ ║ X ║ X ║ o ║ o ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ o ║ X ║ X ║ X ║ o ║ o ║ o ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ X ║ X ║ X ║ o ║ o ║ _ ║ X ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ X ║ _ ║ o ║ o ║ o ║ X ║ X ║
    ╚═══╩═══╩═══╩═══╩═══╩═══╩═══╝

Or itertools.chain.from_iterable:

>>> import itertools
>>> print(fmt.format(*itertools.chain.from_iterable(board)))

    ╔═══╦═══╦═══╦═══╦═══╦═══╦═══╗
    ║ X ║ o ║ o ║ o ║ o ║ X ║ X ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ o ║ o ║ _ ║ _ ║ X ║ X ║ o ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ o ║ _ ║ _ ║ X ║ X ║ o ║ o ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ o ║ X ║ X ║ X ║ o ║ o ║ o ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ X ║ X ║ X ║ o ║ o ║ _ ║ X ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ X ║ _ ║ o ║ o ║ o ║ X ║ X ║
    ╚═══╩═══╩═══╩═══╩═══╩═══╩═══╝

Or you can use a plain itertools.chain and unpack the board with * first:

>>> import itertools
>>> print(fmt.format(*itertools.chain(*board)))

    ╔═══╦═══╦═══╦═══╦═══╦═══╦═══╗
    ║ X ║ o ║ o ║ o ║ o ║ X ║ X ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ o ║ o ║ _ ║ _ ║ X ║ X ║ o ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ o ║ _ ║ _ ║ X ║ X ║ o ║ o ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ o ║ X ║ X ║ X ║ o ║ o ║ o ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ X ║ X ║ X ║ o ║ o ║ _ ║ X ║
    ╠═══╬═══╬═══╬═══╬═══╬═══╬═══╣
    ║ X ║ _ ║ o ║ o ║ o ║ X ║ X ║
    ╚═══╩═══╩═══╩═══╩═══╩═══╩═══╝

Upvotes: 6

Related Questions