【问题标题】:Create a list of dictionaries after you iterate over a list遍历列表后创建字典列表
【发布时间】:2021-07-02 09:47:02
【问题描述】:

我有一个清单:

programs = [PR1, PR2, PR3, PR4, PR5, PR6]

我遍历它并从列表中的 db 获取一些信息:

for program in programs:
    db query = "....." % program
    number_of_users = [db query result]
    EX : number_of_users = [50, 100]

我想知道如何创建这样的字典列表:

 [{"PROGRAM_NAME" : program, "Number of users in 2020" : number_of_users[0], "Number of users in 2021" : number_of_users[1]},
  {"PROGRAM_NAME" : program, "Number of users in 2020" : number_of_users[0], "Number of users in 2021" : number_of_users[1]}, 
  {"PROGRAM_NAME" : program, "Number of users in 2020" : number_of_users[0], "Number of users in 2021" : number_of_users[1]},
.... and so on until the list is over]

【问题讨论】:

  • 这不是minimal reproducible example - 我尝试它时遇到 NameError。请edit 并修复。还要添加您为到达您想去的地方所做的事情。您可以在循环之前创建一个空列表,将数据添加到新字典并将其添加到列表中。做直到循环为空。你到底有什么问题?你知道如何创建字典吗?你知道如何创建列表吗?你知道如何添加吗?

标签: python list dictionary


【解决方案1】:

一个简单的方法是创建一个空列表,并用字典值填充它,如下所示:

newData = []
for program in programs:
    newDict = dict()
    db query = "....." % program
    number_of_users = [db query result]
    EX : number_of_users = [50, 100]
    newDict["PROGRAM_NAME"] = program
    newDict["Number of users in 2020"] = number_of_users[0]
    newDict["Number of users in 2021"] = number_of_users[1]
    newData.append(newDict.copy())

不要忘记使用dictionary.copy,否则你的词典只会在列表中被引用,这会导致一些问题

编辑:正如 Łukasz Kwieciński 所述,最好在一行中执行以下操作:

newData = []
for program in programs:
    db query = "....." % program
    number_of_users = [db query result]
    EX : number_of_users = [50, 100]
    newDict = {"PROGRAM_NAME":program,"Number of users in 2020":number_of_users[0],"Number of users in 2021":number_of_users[1]}
    newData.append(newDict.copy())

【讨论】:

  • 为什么要创建一个空字典,然后在一行中完成所有操作时添加所有键值对? new_dict = {'PROGRAM_NAME': program, ...}
  • 我只是觉得它会更容易理解。但你确实是对的。
  • 绝对不需要复制字典。如果 would 如果您添加到它并添加同一个 dict 的“不同”状态 - 但您在每个循环中重新创建一个新状态。
  • 你确定吗?当我没有复制字典时,我遇到了一些类似情况的问题,当我重新分配字典时,它重新分配了已经分配的变量。
猜你喜欢
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
相关资源
最近更新 更多