【问题标题】:How to compare an element to every first element in a sublist in python?如何将一个元素与python子列表中的每个第一个元素进行比较?
【发布时间】:2020-03-04 06:30:28
【问题描述】:

我的团队成员给了我一本字典,其中存储了菜单在特定日期和时间的数据,如下所示:

    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))

但是,它只打印 menu[6] 而不是 menu[3]。我相信我的 if 语句有问题,但我似乎无法弄清楚。任何帮助,将不胜感激。谢谢!

【问题讨论】:

  • 如果你的团队成员是这样创建菜单“字典”的,你应该让他们重新考虑结构,因为就 Python 而言,这肯定 不是 dict被关注到。将其重构为包含键和所有内容的实际字典,将使提取您需要的数据变得非常简单,而不是到处处理看似任意的索引。
  • 我假设时间(9,0)表示 09:00 是否正确。以及 [time available] 开始和结束时间中的元素?
  • @brainLoop 是的,[time available] 中的列表代表开始时间和结束时间,time(9,0) = 09:00
  • @b_c 我明白你来自哪里,我也向我的团队成员指出过,但他们坚持使用它,所以我别无选择,只能凑合着用它

标签: python list function dictionary nested


【解决方案1】:

您可以使用列表解释来快速迭代列表并返回与您的查询匹配的所有项目。列表解释是这样工作的 [(返回的项目) for (values) in (list) if (boolean statement)]。在这种情况下,我会返回您具有匹配条件的所有索引。

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    相关资源
    最近更新 更多