Лучший способ для dict с дубликатными ключами в python

DX667 спросил: 28 марта 2018 в 04:05 в: python

Я пишу небольшую программу на 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 ddef 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 ответа

Есть решение
MaxNoe ответил: 28 марта 2018 в 04:57
  • Вы можете использовать отображение dict[weekday] -> list[times].
  • Я бы также рекомендовал не писать свой собственный файл конфигурации. В стандартной библиотеке Python есть несколько подходящих форматов файлов. Я бы пошел на JSON.
  • Вы можете избавиться от переключателя с помощью getattr

times.json:

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

, а затем используйте его:

import json
import schedulewith 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)
DX667 ответил: 29 марта 2018 в 03:55

Большое спасибо за ваши ответы. Метод"json" работает как шарм. Отдельное спасибо за два совета по решению"getattr". Я думал, что будет что-то лучше, чем мой огромный диктат.

MaxNoe ответил: 29 марта 2018 в 01:27
Приятно слышать. Однако это должно быть лучше, комментарий, спасибо за ответ