在python中使用重复键的dict的最佳方法

时间:2018-04-21 17:45:23

标签: python python-3.x dictionary

我正在python-3.6中编写一个小程序来控制我的花园浇水。

我有一个文件,我设置了计时器。 例如:

Monday 7:00

所涉及的功能如下所示:

def getTimerFile():
    """ Get timers from file an prepare them."""
    timerFile = config.get("Basic", "TimerFile")
    allowedDays = ["Monday",
                   "Tuesday",
                   "Wednesday",
                   "Thursday",
                   "Friday",
                   "Saturday",
                   "Sunday"]

    try:
        with open(timerFile) as f:
            d = dict(x.rstrip().split(" ", 1) for x in f)
        for key, value in d.items():
            time.strptime(value, "%H:%M")
            if key not in allowedDays:
                raise ValueError(" {}".format(key))

    except Exception as e:
        # TODO: Error handling
    return d


def setTimers(timerDict):
    """Set timer threads."""
    for key, value in timerDict.items():
        findDaySchedule(key, value)


def findDaySchedule(weekday, stTime):
    """Helper function
    for switch/case statement."""
    return {"Monday":  schedule.every().monday.at(stTime).do(mv),
            "Tuesday":  schedule.every().tuesday.at(stTime).do(mv),
            "Wednesday":  schedule.every().wednesday.at(stTime).do(mv),
            "Thursday":  schedule.every().thursday.at(stTime).do(mv),
            "Friday":  schedule.every().friday.at(stTime).do(mv),
            "Saturday":  schedule.every().saturday.at(stTime).do(mv),
            "Sunday":  schedule.every().sunday.at(stTime).do(mv)
            }.get(weekday, None)    # Default is None

如果我每天只使用一个计时器,这可以正常工作。 但是,如果为前。星期六我想要两个计时器,只需要最后一个计时器。

那么使用这个重复键的最佳解决方案是什么。 我尝试过使用' defaultdict'但我没有得到正确工作的循环

提前感谢

2 个答案:

答案 0 :(得分:2)

  • 您可以使用映射dict[weekday] -> list[times]
  • 我还建议不要编写自己的配置文件解析。 python标准库中有几种非常适合的文件格式。我会去找json。
  • 您可以使用getattr
  • 摆脱开关

times.json

{
    "monday": ["07:00", "10:00"],
    "friday": ["09:00"]
}

然后使用它:

import json
import schedule

with open('times.json') as f:
    times = json.load(f)

for day, times in times.items():
    for time in times:
        getattr(schedule.every(), day.lower()).at(time).do(stuff)

答案 1 :(得分:0)

非常感谢您的回答。 " json"方法就像一个魅力。 特别感谢关于" getattr"的两个提示。解。我以为会有比我庞大的词典更好的东西。