我正在从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
}]
我可以为此获得一些指导吗?事先不知道要创建的字典数。
答案 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
您的代码修改了一个字典,因为它是在外部声明的,并且永远不会重置为新对象。