首页 > 解决方案 > 建立未知数量字典的函数

问题描述

根据具有与指定值匹配的值的列表数量创建必要数量的字典的最佳解决方案是什么?以及如何为字典指定直观的名称?

我犯了一个(菜鸟)错误。我硬编码了一组预定义的字典,忽略了潜在的未来案例。

我的片段:

primarytuesday = {}
secondarytuesday = {}
primarythursday = {}
secondarythursday = {}
coaches = [["4/27/1976", "Person One", "Site 1"], ["4/27/1976", "Person Two", "Site 1"],
       ["4/29/1976", "Person Three", "Site 1"], ["4/29/1976", "Person Four", "Site 1"]]


def sort_coaches(date, primary, secondary):
    for eachsession in coaches:
        if eachsession[0] == date:
            if eachsession[2] in primary:
                secondary[eachsession[2]] = eachsession[1]
            else:
                primary[eachsession[2]] = eachsession[1]


sort_coaches("4/27/1976", primarytuesday, secondarytuesday)
sort_coaches("4/29/1976", primarythursday, secondarythursday)

输出(按预期工作):

  1. primarytuesday == {'Site 1': 'Person One'}
  2. secondarytuesday == {'Site 1': 'Person Two'}
  3. primarythursday == {'Site 1': 'Person Three'}
  4. secondarythursday == {'Site 1': 'Person Four'}

问题:如果将特定日期的第三个值添加到列表中,则会出现问题,如...

coaches = [["4/27/1976", "Person One", "Site 1"], ["4/27/1976", "Person Two", "Site 1"], ["4/27/1976", "Person Three", "Site 1"]
           ["4/29/1976", "Person Four", "Site 1"], ["4/29/1976", "Person Five", "Site 1"]]

输出将第二个星期二的值更改为第三个个体,并完全摆脱第二个个体。有道理,但不是预期的。

我的第一个想法是废弃整个代码并为列表中的每个列表创建一个嵌套函数。这可能需要使用 zip,但我不完全确定。

顺便说一句:我确信有更有效的方法,而不是遍历整个列表并eachsession[0]在 for 循环中与日期进行比较,但这可以作为我作为编码员的一个例子。

标签: pythonpython-3.xdictionary

解决方案


您应该在函数的输出中使用列表而不是单个变量。这将允许您拥有任意数量的主要、次要、第三...条目,您可以在一天内使用索引来操作这些条目。

实际上,您可以一次性将整个内容转换为以日期为索引的主字典,然后使用该字典:

coaches = [["4/27/1976", "Person One", "Site 1"], ["4/27/1976", "Person Two", "Site 1"], ["4/27/1976", "Person Three", "Site 1"],
           ["4/29/1976", "Person Four", "Site 1"], ["4/29/1976", "Person Five", "Site 1"]]

sortedCoaches = dict()
for date,person,site in coaches:
    day = sortedCoaches.setdefault(date,list())
    d   = next((d for d in day if site not in d),dict())
    if not d: day.append(d)                    
    d[site] = person


dayInfo = sortedCoaches["4/27/1976"]
[{'Site 1': 'Person One'}, {'Site 1': 'Person Two'}, {'Site 1': 'Person Three'}]


dayInfo = sortedCoaches["4/29/1976"]
[{'Site 1': 'Person Four'}, {'Site 1': 'Person Five'}]

推荐阅读