【问题标题】:Python for loop over dictionary stops after first match with IF statementPython for 循环在第一次与 IF 语句匹配后停止字典
【发布时间】:2023-01-06 22:06:22
【问题描述】:

尝试编写一个简单的脚本来确定日期的月亮名称。我有一个日期和月亮名称的字典,并尝试遍历每个日期以将今天的日期与满月的日期进行比较,希望最后一场比赛获胜,但 Python 似乎在第一场比赛后停止。

#!/usr/bin/python3

from datetime import date

def get_moon_name(d):
    full_moons = {
      '2022-12-07': 'Able',
      '2023-01-06': 'Baker',
      '2023-02-05': 'Charlie',
      '2023-03-07': 'Delta' }

    for md in full_moons.keys():
        moon_date = date.fromisoformat(md)
        print(f"Comparing {d} to {moon_date}")
        if d >= moon_date:
            moon_name = full_moons[md]
        return moon_name

if __name__ == "__main__":
    d_today = date.today()
    print(f"This full moon's name is {get_moon_name(d_today)}")

删除第一个日期将产生 Baker 作为月亮名称,因此如果可以到达它,它就会匹配。

这是 Python 3.9.6 (Mac OS) 或 3.10.9 (Homebrew)。

想法?我敢肯定还有一种更 Pythonic 的方式,但我不明白为什么会失败。

速记: 尝试运行它,预计它会输出 Baker,因为今天是 1 月 6 日,但我得到了 Able,并且没有迹象表明它曾经查看过第二个值。

【问题讨论】:

  • 只需缩减行return moon_name(删除一个缩进单位)

标签: python python-3.x python-3.10


【解决方案1】:

return 语句将在第一场比赛后打破你的 for 循环,所以你总是会得到有能力的作为答案。试试这个:

from datetime import date


def get_moon_name(d):
    full_moons = {
      '2022-12-07': 'Able',
      '2023-01-06': 'Baker',
      '2023-02-05': 'Charlie',
      '2023-03-07': 'Delta' }

    for md in full_moons.keys():
        moon_date = date.fromisoformat(md)
        print(f"Comparing {d} to {moon_date}")
        if d >= moon_date:
            moon_name = full_moons[md]
    
    return moon_name

if __name__ == "__main__":
    d_today = date.today()
    print(f"This full moon's name is {get_moon_name(d_today)}");

【讨论】:

    猜你喜欢
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    相关资源
    最近更新 更多