首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试字典键的存在总是错误的条件

测试字典键的存在总是错误的条件
EN

Stack Overflow用户
提问于 2017-03-19 08:22:45
回答 1查看 67关注 0票数 2

我创建了一个函数,它使用两个字典,curr_statsweekly_result。如果weekly_result中有任何不在curr_stats中的键,则函数应该只打印invalid_msg,而不改变curr_stats

但是,我代码第5行的if语句似乎不起作用。它应该触发下一个if语句,因此不会发生curr_stats的变异。

代码语言:javascript
复制
def update_standings(curr_stats, weekly_result):
    invalid = 0
    point_counter(weekly_result)
    for team in weekly_result:
        if team in curr_stats == False:
            invalid = invalid + 1
    if invalid > 0:
        print(invalid_msg)
    else:
        for team in weekly_result:
            curr_stats[team] = curr_stats[team] + weekly_result[team]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-19 21:02:53

在Python中,优先,包括in。正在发生的是比较链,一种特殊的形式,用于测试传递关系,如数学课中的关系:

代码语言:javascript
复制
if x_min < x < x_max:
    ...

正如PawełKordowski在他的评论中指出的那样,上述比较链主要相当于:

代码语言:javascript
复制
if x_min < x and x < x_max:
    ...

(有一个不同:“等效”代码可能计算两次x,而比较链则精确地计算一次x。)

在您的例子中,比较链是:

代码语言:javascript
复制
if team in curr_stats == False:
    ...

...which (主要)相当于:

代码语言:javascript
复制
if team in curr_stats and curr_stats == False:
    ...

只有当curr_stats包含teamcurr_stats为空时,这才是正确的.这不应该发生的。

代码的问题在于== False --部分原因是它将比较转化为比较链,但最主要的原因是您根本就不需要它。Python提供了not关键字,用于当您想要布尔值相反的时候。你的条件陈述应改为:

代码语言:javascript
复制
if team not in curr_stats:
    invalid = invalid + 1

最后一个建议是:通过摆脱invalid计数器并在找到无效的team后立即返回,这个函数可以变得更短。(一旦您发现weekly_result是无效输入,您可能并不关心它是否“更无效”。)我还使用dict.items简化了最终的for循环:

代码语言:javascript
复制
def update_standings(curr_stats, weekly_result):
    point_counter(weekly_result)
    for team in weekly_result:
        if team not in curr_stats:
            print(invalid_msg)
            return
    for team, result in weekly_result.items():
        curr_stats[team] += result
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42884411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档