【问题标题】:python using for loop to update nested dictionary values with comprehensionpython使用for循环来更新嵌套字典值与理解
【发布时间】:2019-02-03 20:41:53
【问题描述】:

我正在为这个 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 循环,所以我想我需要一个嵌套的字典理解来将所有内容都放在一行中。我不确定这是否正确,但以我有限的知识,这似乎是正确的方向。我的问题是我该怎么做?有人可以帮忙吗?感谢你的宝贵时间。

【问题讨论】:

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


    【解决方案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}}
    

    【讨论】:

      【解决方案2】:

      这是你想要的吗?

      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】:

        你做错了,j for j in binary_list] 会为每个请求[truck][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
        

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 谢谢 blhsing、imtinan Azhar、sinwoobang moe A。我能够在 iter 上阅读更多内容以了解有关您的解决方案的更多信息。我真的很感激。
          猜你喜欢
          • 2021-10-03
          • 2021-06-03
          • 2019-07-16
          • 1970-01-01
          • 2016-06-08
          • 2020-09-13
          • 2017-03-09
          • 1970-01-01
          • 2015-10-13
          相关资源
          最近更新 更多