有没有办法在打印过程中忽略IndexErrors并替换为空白?

时间:2019-02-05 15:38:54

标签: python indexing command-line-interface index-error

我目前仍在学习Python,更具体地说是OOP,我的老师让我的班级创建了耐心(或单人纸牌)控制台表示法。我对对象和方法等非常有信心。但是我有一个问题要解决。

要显示游戏中的每个画面,我正在尝试使用一个循环,该循环将在每行中吐出每张纸牌:

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 / except子句捕获任何异常,但是我已经意识到,无论我尝试捕获多少异常,每个表格中各种卡片的可能性都太多了。因此,由于第一个画面总是以一张卡片开头,因此第一行显示为

S JS X X X X X X HF

,但是一旦 for 循环尝试遍历下一张卡片,就会捕获到 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 :(得分:0)

您可以使用tryexcept <ErrorType>捕获特定的错误。但是,当您可以捕捉到这些错误时,您想要的东西几乎肯定不会以另一个错误结束,就像您到目前为止编写代码的方式一样,except语句中的代码很容易产生与最初相同的错误试图避免。我会这样写:

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

答案 1 :(得分:0)

我将使用字符串代替卡,因为它们具有便捷的方法-str.upper将替代card s的showCard方法。

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

zip可以transpose列表列表。由于子列表的长度不同,因此请使用itertools.zip_longest

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

然后针对每一行,遍历项目并构造一个要打印的字符串,如果 table 中缺少该项目,则使用伪值。

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

Conditional expressions