测试字典键是否存在的条件总是Fals

2024-03-29 07:33:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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]

Tags: 函数代码inforif字典defstats
1条回答
网友
1楼 · 发布于 2024-03-29 07:33:57

在Python中,all comparisons have the same precedence,包括in。 现在发生的是comparison chaining,一种特殊的形式,用来测试传递关系,比如在数学课上:

if x_min < x < x_max:
    ...

正如PawełKordowski在his comment中指出的那样,上面的比较链主要相当于:

if x_min < x and x < x_max:
    ...

(有一个区别: “等价”代码可能会计算x两次,而比较链只计算x一次。)

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

if team in curr_stats == False:
    ...

…主要相当于:

if team in curr_stats and curr_stats == False:
    ...

只有当curr_stats包含team并且curr_stats为空时,这才是正确的。。。这不应该发生。你知道吗

代码的问题在于== False,部分原因是它将一个比较变成了一个比较链,但主要原因是您根本不需要它。 Python提供了not关键字,当您想要布尔值的对立面时。 条件语句应为:

if team not in curr_stats:
    invalid = invalid + 1

最后一个建议: 通过去掉invalid计数器并在找到无效的team后立即返回,这个函数可以变得更短。 (一旦您发现weekly_result是无效输入,您可能就不在乎它是否是“甚至更无效的”。) 我还使用^{}来简化最后的for循环:

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

相关问题 更多 >