将列表条目的字典值设置为列表中的所有字典
Setting dictionary value for list entry duplicates to all dictionaries in list
最近我创建了一个 SurveyMonkey API 程序,它使我可以比使用网站更快地创建和上传调查。我的问题是我切换了我的程序以使其更加通用并且 运行 遇到了问题。
我卡住的部分是当我使用程序将图像 URLs 插入到 JSON 格式的上传负载中时。
我首先创建负载,称为页面,并遍历要上传的图像 URLs 列表,同时将 URL 添加到页面中的特定部分。
我遇到的问题是,当我在页面列表的条目中设置一个字段时,它会更改所有页面列表条目的字段。
例如
page = final payload to upload to surveymonkey
page_template = list of JSON format questions for one page
num_pics = len(img_url_list)
for i in range(num_pics):
# Try except for if page does not have questions
try:
for question_index in range(len(page_template)):
if "presentation" in page_template[question_index]["family"]:
page_template[question_index]["headings"][0]
["image"]["url"] = img_url_list[i]
except:
print("Problem when inserting images...")
page[i] = {
"title": " ",
"description": " ",
"questions": page_template
for one_page in page[:i+1]:
for one_question in one_page["questions"]:
if "presentation" in one_question["family"]:
print(one_question["headings"][0]["image"]["url"])
输出类似...
img1url.jpg
img2url.jpg
img2url.jpg
img3url.jpg
img3url.jpg
img3url.jpg
我简化了代码,否则需要花很长时间才能进一步解释这个程序。
我这辈子都弄不明白为什么列表条目中的字段会针对所有条目进行更改,而不仅仅是我索引到的条目。我曾尝试更改我的代码以在函数外部使用临时变量 and/or,但没有任何效果。
有什么想法吗?
编辑
我希望输出看起来像...
image1url.jpg
image1url.jpg
image2url.jpg
image1url.jpg
image2url.jpg
image3url.jpg
这表明同一图像 URL 没有被复制到所有正文页面模板。
我不确定你的问题,或者预期的输出是什么,但根据我的理解,我稍微重构了你的代码以使用 enumerate
而不是使用不必要的索引来使它有点更具可读性。
for i, url in enumerate(img_url_list):
# Try except for if page does not have questions
try:
for question in page_template:
if "presentation" in question["family"]:
question["headings"][0]["image"]["url"] = url
except:
print("Problem when inserting images...")
page[i] = {
"title": " ",
"description": " ",
"questions": page_template
}
那么您要尝试创建一个新页面,其中包含相同的问题,但每个问题的 URL 不同?发生的事情是您正在通过引用更新问题。所以 page[0]['questions']
和 page[1]['questions']
指向内存中的同一个地方。解决这个问题的一种方法是在每次更改之前复制 page_template
:
from copy import deepcopy
for i, url in enumerate(img_url_list):
# Make a copy of the page for this iteration
current_page = deepcopy(page_template)
# Try except for if page does not have questions
try:
for question in current_page:
if "presentation" in question["family"]:
question["headings"][0]["image"]["url"] = url
except:
print("Problem when inserting images...")
page[i] = {
"title": " ",
"description": " ",
"questions": current_page
}
希望有帮助,否则我需要更多关于预期输出的信息,也许还有示例 page_template
/img_url_list values
。
居然找到了答案...
问题是我从 JSON 文件中提取正文页面 JSON 格式的模板。然后为每个图像复制一次此模板 URL。
我想因为我只读了一次 JSON 文件并复制了信息,所以它使所有副本都统一了。
为了解决这个问题,我刚刚编写了一个接受 JSON 文件路径和图像 URL 作为输入的函数。该函数然后读取正文模板的 JSON 文件并插入图像 URL。输出是生成的正文 JSON 格式,其中插入了图像 URL。
由于此函数为它插入的每个图像读取一次 JSON 文件,因此避免了我之前遇到的错误。
最近我创建了一个 SurveyMonkey API 程序,它使我可以比使用网站更快地创建和上传调查。我的问题是我切换了我的程序以使其更加通用并且 运行 遇到了问题。
我卡住的部分是当我使用程序将图像 URLs 插入到 JSON 格式的上传负载中时。
我首先创建负载,称为页面,并遍历要上传的图像 URLs 列表,同时将 URL 添加到页面中的特定部分。
我遇到的问题是,当我在页面列表的条目中设置一个字段时,它会更改所有页面列表条目的字段。
例如
page = final payload to upload to surveymonkey
page_template = list of JSON format questions for one page
num_pics = len(img_url_list)
for i in range(num_pics):
# Try except for if page does not have questions
try:
for question_index in range(len(page_template)):
if "presentation" in page_template[question_index]["family"]:
page_template[question_index]["headings"][0]
["image"]["url"] = img_url_list[i]
except:
print("Problem when inserting images...")
page[i] = {
"title": " ",
"description": " ",
"questions": page_template
for one_page in page[:i+1]:
for one_question in one_page["questions"]:
if "presentation" in one_question["family"]:
print(one_question["headings"][0]["image"]["url"])
输出类似...
img1url.jpg
img2url.jpg
img2url.jpg
img3url.jpg
img3url.jpg
img3url.jpg
我简化了代码,否则需要花很长时间才能进一步解释这个程序。
我这辈子都弄不明白为什么列表条目中的字段会针对所有条目进行更改,而不仅仅是我索引到的条目。我曾尝试更改我的代码以在函数外部使用临时变量 and/or,但没有任何效果。
有什么想法吗?
编辑
我希望输出看起来像...
image1url.jpg
image1url.jpg
image2url.jpg
image1url.jpg
image2url.jpg
image3url.jpg
这表明同一图像 URL 没有被复制到所有正文页面模板。
我不确定你的问题,或者预期的输出是什么,但根据我的理解,我稍微重构了你的代码以使用 enumerate
而不是使用不必要的索引来使它有点更具可读性。
for i, url in enumerate(img_url_list):
# Try except for if page does not have questions
try:
for question in page_template:
if "presentation" in question["family"]:
question["headings"][0]["image"]["url"] = url
except:
print("Problem when inserting images...")
page[i] = {
"title": " ",
"description": " ",
"questions": page_template
}
那么您要尝试创建一个新页面,其中包含相同的问题,但每个问题的 URL 不同?发生的事情是您正在通过引用更新问题。所以 page[0]['questions']
和 page[1]['questions']
指向内存中的同一个地方。解决这个问题的一种方法是在每次更改之前复制 page_template
:
from copy import deepcopy
for i, url in enumerate(img_url_list):
# Make a copy of the page for this iteration
current_page = deepcopy(page_template)
# Try except for if page does not have questions
try:
for question in current_page:
if "presentation" in question["family"]:
question["headings"][0]["image"]["url"] = url
except:
print("Problem when inserting images...")
page[i] = {
"title": " ",
"description": " ",
"questions": current_page
}
希望有帮助,否则我需要更多关于预期输出的信息,也许还有示例 page_template
/img_url_list values
。
居然找到了答案...
问题是我从 JSON 文件中提取正文页面 JSON 格式的模板。然后为每个图像复制一次此模板 URL。
我想因为我只读了一次 JSON 文件并复制了信息,所以它使所有副本都统一了。
为了解决这个问题,我刚刚编写了一个接受 JSON 文件路径和图像 URL 作为输入的函数。该函数然后读取正文模板的 JSON 文件并插入图像 URL。输出是生成的正文 JSON 格式,其中插入了图像 URL。
由于此函数为它插入的每个图像读取一次 JSON 文件,因此避免了我之前遇到的错误。