Python从迭代源创建字典列表

时间:2020-05-24 08:32:39

标签: python json list dictionary

我正在从Excel中读取内容,需要从中创建一个json文件。遍历行,我试图为每行创建一个字典并将其附加到列表中,然后该列表将是一个特定json键的值。

使用:

dates = []
d_tems = {}

for k,v in data.iterrows():
    if (v["recommended_planting_date"] != "NA"):
        d_tems.update({"start_date":str(v["recommended_date"]).strip()})
        d_tems.update({"date_range":str(int(v["date_range"]))}) 
        print(d_tems)
        dates.append(d_tems)

它似乎也更新了已经添加到列表中的值,给了我

[{'start_date': '01/08', 'date_range': '60'},
 {'start_date': '01/08', 'date_range': '60'}]

代替

[{'start_date': '01/03', 'date_range': '25'},
{'start_date': '01/08', 'date_range': '60'}]

我试图最终达到:

"dates": [
        {
          "start_date": '01/03',
          "date_range": 25
        },
        {
          "start_date": 01/08,
          "date_range": 60
        }]

我可以为此获得一些指导吗?事先不知道要创建的字典数。

2 个答案:

答案 0 :(得分:2)

您在循环外声明了d_tems,因此每次迭代都使用相同的实例,

  • 在更新d_tems时:只有一个字典,因此它会删除以前的值
  • 追加到dates时:您添加了相同内容,因此在列表中可以看到它多次

在循环内创建

dates = []

for k,v in data.iterrows():
    d_tems = {}
    if (v["recommended_planting_date"] != "NA"):
        d_tems.update({"start_date":str(v["recommended_date"]).strip()})
        d_tems.update({"date_range":str(int(v["date_range"]))}) 
        print(d_tems)
        dates.append(d_tems)

您可以通过删除多余的变量来简化代码,并根据需要的代码级别同时创建+添加

dates = []    
for k,v in data.iterrows():
    if (v["recommended_planting_date"] != "NA"):
        dates.append({"start_date" : str(v["recommended_date"]).strip(), 
                      "date_range" : str(int(v["date_range"]))})

最后,为预期的输出做

result = {"dates": dates}

答案 1 :(得分:1)

d_tems = {}移动到for循环内,以便在每次运行时重新创建一个新字典:

dates = []

for k,v in data.iterrows():
    d_tems = {}     # move here
    if (v["recommended_planting_date"] != "NA"):
        d_tems.update({"start_date":str(v["recommended_date"]).strip()})
        d_tems.update({"date_range":str(int(v["date_range"]))}) 
        print(d_tems)
        dates.append(d_tems)
        # d_tems = {}  # doing this here would work as well, but the former is cleaner 

您的代码修改了一个字典,因为它是在外部声明的,并且永远不会重置为新对象。

相关问题