Как сравнить элемент с каждым первым элементом в подсписке в Python? - PullRequest
0 голосов
/ 07 ноября 2019

Член моей команды передал мне словарь, в котором хранятся данные для меню на определенную дату и время, например:

    storeMenu = {}
    # menu[id] MenuName,storeID,[days],[time available],[meals available]
    storeMenu[1] = ['Mon Tues Special', 1, [0, 1], [[time(9, 0), time(10, 59)]], [1, 2]]
    storeMenu[2] = ['Thurs Fri Menu', 1, [3, 4], [[time(9, 0), time(10, 59)]], [5, 4]]
    storeMenu[3] = ['Wednesday Menu', 1, [2], [[time(9, 0), time(11, 00)], [time(14, 00), time(19, 00)]], [1, 2]]
    storeMenu[4] = ['Wednesday Lunch Menu', 1, [2], [[time(11, 0), time(14, 00)]], [1, 2, 4]]

    storeMenu[5] = ['Breakfeast Menu', 2, [0, 1, 2, 3, 4], [[time(9, 0), time(10, 59)]], [6, 7, 8]]
    storeMenu[6] = ['Lunch and Dinner Menu', 2, [0, 1, 2, 3, 4], [[time(11, 00), time(20, 00)]], [9]]

Я хочу вернуть меню [x], если выбранное время падает междувремя начала и время окончания. Я закодировал функцию для извлечения времени ее начала, окончания и функцию для проверки.

    def getStartTime(storeMenu):
        menu = []

        for x in storeMenu:
            if(len(storeMenu[x][3]) == 1):
                result = [x, storeMenu[x][3][0][0]]
                menu.append(result)
            elif(len(storeMenu[x][3]) > 1):
                result1 = [x, storeMenu[x][3][0][0]]
                result2 = [x, storeMenu[x][3][1][0]]
                result = result1+result2
                menu.append(result)  

        return menu

    print(getStartTime(storeMenuFile))

    def getEndTime(storeMenu):
        menu = []
        for x in storeMenu:
            if(len(storeMenu[x][3]) == 1):
                result = [x, storeMenu[x][3][0][1]]
                menu.append(result)
            elif(len(storeMenu[x][3]) > 1):
                result1 = [x, storeMenu[x][3][0][1]]
                result2 = [x, storeMenu[x][3][1][1]]
                result = result1+result2
                menu.append(result)
        return menu

    print(getEndTime(storeMenuFile))


    def menuAtSelectedTime(storeMenu, sTime, selTime, eTime):
        menu = []

        for menuID in storeMenu:
            if(menuID == sTime[menuID-1][0] & menuID == eTime[menuID-1][0]):
                startTime = sTime[menuID-1][1]
                endTime = eTime[menuID-1][1]
                if(startTime < selTime < endTime):
                    result = [menuID, storeMenu[menuID]]
                    menu.append(result)
        return menu

    sTime = getStartTime(storeMenuFile)
    eTime = getEndTime(storeMenuFile)
    selTime = time(15, 00)
    print(menuAtSelectedTime(storeMenuFile, sTime, selTime, eTime))

Однако она печатает только меню [6], а не меню [3]. Я верю, что в моем утверждении if что-то не так, но, похоже, не могу понять. Любая помощь будет оценена. Спасибо!

1 Ответ

0 голосов
/ 07 ноября 2019

Вы можете использовать интерпретацию списка, чтобы быстро перебирать список и возвращать все элементы, соответствующие вашему запросу. Интерпретация списка работает как таковая [(возвращаемые элементы) для (значений) в (list) if (логическое выражение)]. В этом случае я возвращаю все индексы, в которых у вас есть условие соответствия.

inds = [i for i, (MenuName,storeID,days,times,mealsavail) in enumerate(menu) if any([tstart>cond and tend<cond for tstart, tend in times])]

Наконец, возвращаю все меню по этим индексам, используя другую интерпретацию списка.

[menu[i] for i in inds]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...