在 for 循环中创建嵌套字典

时间:2021-04-07 13:42:15

标签: python

嗨,我正在尝试创建应该如下所示的嵌套字典:

{'4/1': {'A': 5, 'B': 6},  '4/2': {'A': 1, , 'B': 7}, '4/3': {'A': 4, 'B': 3}}

我得到的是:

{'4/1': {'A': 5}, '4/2': {'A': 1}, '4/3': {'A': 4}}

代码:

import random
import datetime as dt

futuresIncome = {}
incomeTypes = ["A", "B"]

for incomeType in incomeTypes:
    for month in range(4, 5):
        for day in range(1, 4):
            date = str(month) + "/" + str(day)
            
            if date in futuresIncome.keys():
                continue
            else:
                futuresIncome[date] = {}
                futuresIncome[date][incomeType] = random.randint(1, 11)

我做错了什么?谢谢。

4 个答案:

答案 0 :(得分:2)

您需要使用defaultdict

import random
import datetime as dt
from collections import defaultdict

futuresIncome = defaultdict(dict)
incomeTypes = ["A", "B"]

for incomeType in incomeTypes:
    for month in range(4, 5):
        for day in range(1, 4):
            date = str(month) + "/" + str(day)
            futuresIncome[date][incomeType] = random.randint(1, 11)
            

答案 1 :(得分:1)

您不应该在 continue 块中if,而是添加当前 date 的数据:

if date in futuresIncome.keys():
    futuresIncome[date][incomeType] = random.randint(1, 11)

您还可以使用 setdefault() 方法并摆脱 if-else 块:

for incomeType in incomeTypes:
    for month in range(4, 5):
        for day in range(1, 4):
            date = str(month) + "/" + str(day)
            futuresIncome.setdefault(date, {}).update({incomeType: random.randint(1, 11)})

答案 2 :(得分:0)

            if date in futuresIncome.keys():
                continue

这部分导致

            else:
                futuresIncome[date] = {}
                futuresIncome[date][incomeType] = random.randint(1, 11)

如果 futuresIncome 不包含此日期,则只会执行一次。

可能你想做这样的事情:

            if date in futuresIncome.keys():
                futuresIncome[date] = {}
            futuresIncome[date][incomeType] = random.randint(1, 11)

一般来说,比这更好的选择是 defaultdict

答案 3 :(得分:0)

我会建议在最内层循环中迭代incomeTypes,如下所示: `

import random

import datetime as dt

futuresIncome = {}

incomeTypes = ["A", "B"]


for month in range(4, 5):

    for day in range(1, 4):

         for incomeType in incomeTypes:
            date = str(month) + "/" + str(day)
            
            if date in futuresIncome.keys():
                continue
            else:
                futuresIncome[date] = {}
                futuresIncome[date][incomeType] = random.randint(1, 11)`