Есть ли способ игнорировать IndexErrors во время печати и заменить его пробелом? - PullRequest
0 голосов
/ 05 февраля 2019

В настоящее время я все еще изучаю Python, а точнее ООП, и мой учитель поручил моему классу создать консольное представление терпения (или пасьянса).Я достаточно уверен в объектах, методах и т. Д., Но есть одна конкретная проблема, с которой у меня возникают проблемы.

Чтобы отобразить каждую таблицу в игре, я пытаюсь использовать цикл, который будет выплевывать каждую картув отдельных строках:

noColumns = 0
    for tableau in self.tableaus:
        if len(tableau) > noColumns:
            noColumns = len(tableau)

    for column in range(noColumns):
        if column == 0:
            print('S ', self.tableaus[0][column].showCard(), self.tableaus[1][column].showCard(), self.tableaus[2][column].showCard(), self.tableaus[3][column].showCard(),
            self.tableaus[4][column].showCard(), self.tableaus[5][column].showCard(), self.tableaus[6][column].showCard(), ' HF')
        elif column > 0 and column < 4:
            try:
                print(self.waste[column-1].showCard(), ' ', self.tableaus[0][column].showCard(), self.tableaus[1][column].showCard(), self.tableaus[2][column].showCard(), self.tableaus[3][column].showCard(),
                self.tableaus[4][column].showCard(), self.tableaus[5][column].showCard(), self.tableaus[6][column].showCard(), (self.gameAttributes['Suits'][column]+'F'))
            except:
                print('  ', self.tableaus[0][column].showCard(), self.tableaus[1][column].showCard(), self.tableaus[2][column].showCard(), self.tableaus[3][column].showCard(),
                self.tableaus[4][column].showCard(), self.tableaus[5][column].showCard(), self.tableaus[6][column].showCard(), (self.gameAttributes['Suits'][column]+'F'))

Где tableaus - это список из 7 подсписков, которые могут содержать отдельные объекты карт в зависимости от перемещения карт игроком.Я уже пытался отлавливать любые исключения, используя показанные в статье предложения try / исключением, однако я понял, что независимо от того, сколько исключений я пытаюсь отловить, просто существует слишком много возможностей для множества карт в каждой таблице.Следовательно, поскольку первая таблица всегда начинается с одной карты, первая строка отображается как

S JS X X X X X X HF

, но как только цикл для пытается выполнить итерациючерез следующие карточки он ловит IndexError :

    Traceback (most recent call last):
  File "C:\Users\xxxxxx\Desktop\solitaire or patience.py", line 67, in gameDisplay
    print(self.waste[column-1].showCard(), ' ', self.tableaus[0][column].showCard(), self.tableaus[1][column].showCard(), self.tableaus[2][column].showCard(), self.tableaus[3][column].showCard(),
IndexError: list index out of range

Есть ли у кого-нибудь альтернативное предложение о том, как я мог бы реализовать этот код, чтобы игнорировать или заменять неиндексированные значения пробелами, или альтернативныйподходить в целом?

Большое спасибо за то, что даже прочитали это далеко!

РЕДАКТИРОВАТЬ - Минимальный пример:

tableaus = [[0],[0,1],[0,1,2],[0,1,2,3],[0,1,2,3,4],[0,1,2,3,4,5],[0,1,2,3,4,5,6]]

longest = 0
for tableau in tableaus:
    if len(tableau)>longest:
        longest = len(tableau)

for column in range(longest):
    print('S ', tableaus[0][column], tableaus[1][column], tableaus[2][column], tableaus[3][column],
                tableaus[4][column], tableaus[5][column], tableaus[6][column], ' HF')

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Я буду использовать строки вместо карт, потому что они имеют удобные методы - str.upper будет заменой вашего card s 'showCard метода.

tableaus = [list('a'),list('ab'),list('abc'),list('abcd'),
            list('abcde'),list('abcdef'),list('abcdefg')]

zip может транспонировать список списков.Поскольку подсписки имеют различную длину, используйте itertools.zip_longest .

lines = itertools.zip_longest(*tableaus, fillvalue=None)

Затем для каждой строки переберите элементы и создайте строку для печати, используйте фиктивное значение, если элемент отсутствует в таблице .

for line in lines:
    line = (item.upper() if item else '-' for item in line)
    line = ''.join(line)
    print('S', line, 'HF')

>>>
S AAAAAAA HF
S -BBBBBB HF
S --CCCCC HF
S ---DDDD HF
S ----EEE HF
S -----FF HF
S ------G HF

Условные выражения

0 голосов
/ 05 февраля 2019

Вы можете поймать определенные ошибки с try и except <ErrorType>.Но когда вы можете поймать эти ошибки, вы хотите, чтобы что-то, что почти наверняка не заканчивалось другой ошибкой, так, как вы уже написали свой код, код в вашем операторе "исключение" может очень легко привести к той же самой ошибке, что и изначально.пытаясь избежать.Я написал бы это:

tableaus = [[0],[0,1],[0,1,2],[0,1,2,3],[0,1,2,3,4],[0,1,2,3,4,5], 
            [0,1,2,3,4,5,6]]

longest = 0
for tableau in tableaus:
    if len(tableau)>longest:
        longest = len(tableau)

for column in range(longest):
    string_start = "S "
    string_middle = ""
    for i in range(7):
        try:
            x = str(tableaus[i][column])
        except IndexError:
            x = " "
        string_middle += x
    string_end = " HF"

    final_string = string_start + string_middle + string_end
    print(final_string)

Запуск вышеупомянутого, не даст никаких IndexErrors, и даст вам:

$ python3 t.py
S 0000000 HF
S  111111 HF
S   22222 HF
S    3333 HF
S     444 HF
S      55 HF
S       6 HF
...