如何解决如何最好地通过字典键进行迭代并比较值?
我对编程非常陌生,大约2周前才开始学习Python 3。
做一个我觉得很困难的练习,该练习旨在创建一个接受字典作为参数的函数,并应确定字典是否代表“有效”棋盘。请注意,以下代码仅针对该功能的一个方面。我最努力的部分。
我花了很多时间在这个特定的项目上,并试图确保这两个选项都是“有效的”代码,所以afaik都没有错误?
想象一个网格(我将打印列表),该网格应该代表棋盘上的正方形。有人可以告诉我哪个代码更可接受吗?为什么?或者,如果有更简单的方法可以做到这一点?如果需要更多,我只会发布与我的问题“相关”的内容。
检查字典键是否有效的棋盘格
# acceptable range is columns 1 - 8 rows a - h
for board_squares in dic:
try: # this will accept any value as int
if (int(board_squares[0:-1]) <= 8 # as slice up to last key char
and board_squares[-1] <= 'h') \
is False:
print((Err) + ' Square outside range')
return False
except ValueError as e:
print((Err) + ' Improper dictionary')
return False # when testing function this can be replaced with return False
重要说明: 在这种情况下,我指的是“ board_squares”作为字典键。这是经过大量努力后我想到的第一个代码。它对字典键进行切片,然后将其与应该表示“有效”的棋盘方块进行比较。我对此有一些负面反馈,所以我回到了绘图板上,提出了以下代码:
def char_range(c1,c2):
"""Generates the characters from `c1` to `c2`,inclusive."""
for c in range(ord(c1),ord(c2)+1):
yield chr(c)
chessboard_squares = []
for chr1 in range(1,9):
for chr2 in char_range('a','h'):
chessboard_squares.append(str(chr1) + chr2)
print(chessboard_squares) # this is simply to print list so I have a visual representation
for key in dic:
if key in list \
is False:
print((Err) + ' Square outside range')
return False
重要说明: 在这种情况下,我将Chessboard_squares称为与字典键进行比较的列表中的值。第二个代码需要顶部的功能范围超过字母。我试图通过使用明确定义的变量标签来确保其可读性强。它会创建一个列表,列出“有效字典键应为”,以代表国际象棋棋盘格。最后是有效的字典键“应该”的印刷清单。为了清楚起见,邮政采用棋盘格正方形的格式。
['1a','1b','1c','1d','1e','1f','1g','1h','2a','2b','2c','2d','2e','2f','2g','2h','3a','3b','3c','3d','3e','3f','3g','3h','4a','4b','4c','4d','4e','4f','4g','4h','5a','5b','5c','5d','5e','5f','5g','5h','6a','6b','6c','6d','6e','6f','6g','6h','7a','7b','7c','7d','7e','7f','7g','7h','8a','8b','8c','8d','8e','8f','8g','8h']
解决方法
自从我发布了这个问题以来,我学到了很多新东西,并决定回答自己的问题。或者,如果有更简单的方法可以做到这一点?这是一个更清洁的方法,应被视为“最佳”选择。
try:
if all (
(1 <= int(row) <= 8) and ('a' <= col <= 'h')
for row,col in dict
):
return True
except ValueError:
return False
首先,我们使用all()
函数,该函数接受传递给它的所有参数,如果所有参数均为True,则返回True。空字符串算作True的特殊例外。
我们所有的字典键都是(假设是)两个可迭代的字符串,如果我将字典键中的字符分配给变量,那么我可以在这里使用多个赋值(也就是元组拆包)。
在这种情况下,我们将字典键的第一个字符分配给row,将字典键的第二个字符分配给col(umn)。
我仍然可以使用try / except ValueError,因为如果字典键不完全是2个字符,它将引发相同的错误,并且我正在检查特定的键。
列表或生成器“理解”的简单理解的简短版本是doSomething for variable in iterable
,这是“生成器理解”。我们最终得到的是:
执行某些操作:将cmp int(row)设为1-8 and
col'a'-'h'
用于:行(字典键的第一个字符),列(字典键的第二个字符)
输入:字典键。
因为这是“生成器理解”,所以它将基于每次循环迭代创建一组值。
并且作为示例,可能看起来像这样:True,False,False,True等。
这些值将依次传递到all()
,它将消耗它们,如果ALL为True,否则返回True。
如果有人希望进一步看一下,这里有一些资源可以帮助您理解代码:
全部功能:
https://docs.python.org/3/library/functions.html#all
理解列表理解:
https://medium.com/swlh/list-comprehensions-in-python-3-for-beginners-8c2b18966d93
这很棒,因为它解释了“屈服”,这对理解生成器理解至关重要:
What does the "yield" keyword do?
多项分配:
https://treyhunner.com/2018/03/tuple-unpacking-improves-python-code-readability/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。