python使用for循环以理解方式更新嵌套字典值

时间:2018-08-29 06:38:59

标签: python python-3.x for-loop nested dictionary-comprehension

我为此for循环而苦苦挣扎。我想用列表更新嵌套字典的值。以下作品,但我想使用for循环来压缩代码。 "status"是一个嵌套的字典,具有外键"A""B",而binary_list[]仅具有全1。

Trucks = ["A", "B"]
Days= ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday",    
"Saturday", "Sunday"]

requests={"A": {"Monday":0, "Tuesday":0, "Wednesday":0, "Thursday":0     
                "Friday":0, "Saturday":0, "Sunday":0},
          "B": {"Monday":0, "Tuesday":0, "Wednesday":0, "Thursday":0,    
                "Friday":0, "Saturday":0, "Sunday":0}}


binary_list=[1,1,1,1,1,1,1,1,1,1,1,1,1,1]



status["A"]["Monday"]=binary_list[0]
status["A"]["Tuesday"]=binary_list[1]
status["A"]["Wednesday"]=binary_list[2]
status["A"]["Thursday"]=binary_list[3]
status["A"]["Friday"]=binary_list[4]
status["A"]["Saturday"]=binary_list[5]
status["A"]["Sunday"]=binary_list[6]

status["B"]["Monday"]=binary_list[7]
status["B"]["Tuesday"]=binary_list[8]
status["B"]["Wednesday"]=binary_list[9]
status["B"]["Thursday"]=binary_list[10]
status["B"]["Friday"]=binary_list[11]
status["B"]["Saturday"]=binary_list[12]
status["B"]["Sunday"]=binary_list[13]

我尝试了什么:

   for truck in Trucks:
        for day in Days:
            requests[truck][day]=[j for j in binary_list]

这将在列表中产生14 1作为每天的值。我知道为什么会这样。这是因为有2个for循环,所以我想我需要一个嵌套的字典理解才能使所有内容变成一行。我不确定这是正确的,但据我所知,这似乎是正确的方向。我的问题是我该怎么做?有人可以帮忙吗?感谢你的宝贵时间。

4 个答案:

答案 0 :(得分:1)

您可以使用迭代器遍历binary_list的值:

iter_binary_list = iter(binary_list)
for truck in Trucks:
    for day in Days:
        requests[truck][day] = next(iter_binary_list)

答案 1 :(得分:1)

您所做的是错误的,binary_list中的j为j会为每个请求[卡车] [day]创建一个列表,这不是您想要的,您想要的是这样的

binary_list_iterator=0

for truck in Trucks:
    for day in Days:
        requests[truck][day]=binary_list[binary_list_iterator]
        binary_list_iterator+=1

答案 2 :(得分:1)

这是您想要的吗?

requests = {t: {d: 1 for d in Days} for t in Trucks}

或者如果您想迭代所有内容

requests = {t: {d: binary_list[i*len(Days)+j] for j, d in enumerate(Days)} for i, t in enumerate(Trucks)}

答案 3 :(得分:1)

您可以使用字典理解以一种衬里和更多“ pythonic”方式执行此操作,如下所示:

it = iter(binary_list)
status = {x: {d: next(it) for d in Days} for x in Trucks}
# outputs: {'A': {'Monday': 1, 'Tuesday': 1, 'Wednesday': 1, 'Thursday': 1, 'Friday': 1, 'Saturday': 1, 'Sunday': 1}, 'B': {'Monday': 1, 'Tuesday': 1, 'Wednesday': 1, 'Thursday': 1, 'Friday': 1, 'Saturday': 1, 'Sunday': 1}}