有没有办法在打印过程中忽略 IndexErrors 并替换为空格?
Is there a way to ignore IndexErrors during printing and replace with whitespace?
我目前仍在学习 Python,更具体地说是 OOP,我的老师给我的任务是 class 创建耐心(或单人纸牌)的控制台再现。我对对象和方法等相当有信心。但是有一点我遇到了麻烦。
为了显示游戏中的每个画面,我正在尝试使用一个循环,该循环将在单独的行中吐出每张牌:
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')
您可以使用 try
和 except <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
我将使用字符串代替卡片,因为它们有方便的方法 - str.upper
将代替您的 card
s 的 showCard
方法。
tableaus = [list('a'),list('ab'),list('abc'),list('abcd'),
list('abcde'),list('abcdef'),list('abcdefg')]
zip can transpose a list of lists. Since the sublists have varying lengths use itertools.zip_longest。
lines = itertools.zip_longest(*tableaus, fillvalue=None)
然后对于每一行,遍历项目并构建要打印的字符串,如果 tableau 中缺少该项目,则使用虚拟值。
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
我目前仍在学习 Python,更具体地说是 OOP,我的老师给我的任务是 class 创建耐心(或单人纸牌)的控制台再现。我对对象和方法等相当有信心。但是有一点我遇到了麻烦。
为了显示游戏中的每个画面,我正在尝试使用一个循环,该循环将在单独的行中吐出每张牌:
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')
您可以使用 try
和 except <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
我将使用字符串代替卡片,因为它们有方便的方法 - str.upper
将代替您的 card
s 的 showCard
方法。
tableaus = [list('a'),list('ab'),list('abc'),list('abcd'),
list('abcde'),list('abcdef'),list('abcdefg')]
zip can transpose a list of lists. Since the sublists have varying lengths use itertools.zip_longest。
lines = itertools.zip_longest(*tableaus, fillvalue=None)
然后对于每一行,遍历项目并构建要打印的字符串,如果 tableau 中缺少该项目,则使用虚拟值。
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