如何最好地通过字典键进行迭代并比较值?

如何解决如何最好地通过字典键进行迭代并比较值?

我对编程非常陌生,大约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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-