максимальная фиксированная ширина массива досок Python

Здесь снова с предложением и потребностью;
как вы можете знать из моего предыдущего вопроса, я создаю простой скрипт игрового автомата.
Я хочу, чтобы пять чисел были напечатаны на минимальной доске, доска 9x9 '[]'

вот так:

[] [] [] [] [] [] [] [] []
[] [] [] [] [] [] [] [] []
[] [] [] [] [] [] [] [] []
[] [] [] [] [] [] [] [] []
[] [] [] [] [] [] [] [] []
[] [] [] [] [] [] [] [] []
[] [] [] [] [] [] [] [] []
[] [] [] [] [] [] [] [] []
[] [] [] [] [] [] [] [] []

числа будут напечатаны в центре сетки следующим образом:

[] [] [] [] [] [] [] [] []
[] [] [] [] [] [] [] [] []
[] [] [] [] [] [] [] [] []
[] [] [] [] [] [] [] [] []
[] [] O O O O O [] []
[] [] [] [] [] [] [] [] []
[] [] [] [] [] [] [] [] []
[] [] [] [] [] [] [] [] []
[] [] [] [] [] [] [] [] []

но что я хочу, как и все, кто создает доску, подобную этой, массив представляет собой строку фиксированной ширины с числами внутри нее.

функция, которая распечатывает всю доску, такова:

slot = []
for row in range(9):
    slot.append(['[]'] * 9)

def print_slot(slot):
    for element in slot:
        print(" ".join(element))
print_slot(slot)

как я могу использовать инструмент форматирования, такой как .format, если во второй части моего скрипта мне нужно будет получить доступ к списку slot по точному индексу каждого '[]', чтобы сделать замену числами?

def game_start():
    if start == str(' '):
        first_n = random.randint(0, 9)
        second_n = random.randint(0, 9)
        third_n = random.randint(0, 9)
        fourth_n = random.randint(0, 9)
        fifth_n = random.randint(0, 9)
        slot[4][2] = str(first_n)
        slot[4][3] = str(second_n)
        slot[4][4] = str(third_n)
        slot[4][5] = str(fourth_n)
        slot[4][6] = str(fifth_n)
        print_slot(slot)
game_start()

пришло время построить массив для идеальной платы фиксированной ширины для всех, кто в ней нуждается!

:-)

person Mat    schedule 24.12.2014    source источник


Ответы (1)


Вы можете использовать заполнение с форматированием строки, чтобы выполнить это довольно легко.

Во-первых: в вашем примере вы назвали строки element, но ради здравомыслия это должно быть

def print_slot(slot):
    for row in slot:
        print(" ".join(row))

с новым именем вы можете сделать

def print_slot(slot):
    for row in slot:
        print(" ".join('{: >2}'.format(element) for element in row))

дополнить левую сторону так, чтобы она имела ширину 2

[] [] [] [] [] [] [] [] []                                                                                                                                  
[] [] [] [] [] [] [] [] []                                                                                                                                  
[] [] [] [] [] [] [] [] []                                                                                                                                  
[] [] [] [] [] [] [] [] []                                                                                                                                  
[] []  1  6  8  5  6 [] []                                                                                                                                  
[] [] [] [] [] [] [] [] []                                                                                                                                  
[] [] [] [] [] [] [] [] []                                                                                                                                  
[] [] [] [] [] [] [] [] []                                                                                                                                  
[] [] [] [] [] [] [] [] [] 

Лично я бы сделал так:

slot = []
for row in range(9):
    slot.append([None] * 9)

def print_slot(slot, empty='[ ]'):
    for row in slot:
        print(' '.join(empty if element is None else '{{: ^{}}}'.format(len(empty)).format(element) for element in row))

который будет центрировать элементы, делая его таким

[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
[ ] [ ]  7   7   9   8   4  [ ] [ ]
[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
person Ngenator    schedule 24.12.2014
comment
вау, это полностью отвечает на мой вопрос, но я не могу полностью понять, как это работает, мне действительно нужно много учиться! - person Mat; 24.12.2014
comment
@Mat, есть что-то конкретное, чего ты не понимаешь? Первый пример определенно проще, так как он форматирует все элементы, включая те, которые [] Второй пример более сложный и, вероятно, не подходит для домашней работы. - person Ngenator; 24.12.2014
comment
я не понимаю, что именно делает строка (" ".join('{: >2}'.format(element) for element in row)), и я все еще не могу определить функцию, которая стирает доску и записывает ее снова на каждом этапе программы, как я спросил здесь сегодня - person Mat; 24.12.2014
comment
@Mat в основном, для каждого element в формате row элемент использует string.format для добавления пробелов слева, пока результирующая строка не станет длиной 2 символа. Ссылка в ответе на документы для string.format. - person Ngenator; 24.12.2014