将列表条目的字典值设置为列表中的所有字典

时间:2017-08-29 20:54:33

标签: python api dictionary duplicates surveymonkey

最近我创建了一个SurveyMonkey API程序,让我可以更快地创建和上传调查,而不是使用网站。我的问题是我开启了我的程序,使其更加通用并遇到了问题。

我坚持使用的部分是当我使用程序将图像URL插入到JSON格式的上传有效负载中时。

我首先创建名为page的有效负载,然后遍历图像URL列表进行上传,并将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

我简化了代码,否则需要永远解释这个程序。

我不能为我的生活弄清楚为什么列表条目中的字段正在为所有条目而不是仅仅我索引的那些条目进行更改。我尝试改变我的代码以使用临时变量和/或外部函数,但没有任何工作。

有什么想法吗?

修改

我希望输出看起来像......

image1url.jpg

image1url.jpg
image2url.jpg

image1url.jpg
image2url.jpg
image3url.jpg

这将显示相​​同的图像URL未被复制到所有正文页面模板。

2 个答案:

答案 0 :(得分:0)

我不确定您的问题是什么,或者预期的输出是什么,但根据我的理解,我稍微重构了您的代码以使用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
    }

那么您尝试做的是创建一个具有相同问题但每个网址不同的新网页?发生的是您正在通过引用更新问题。因此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

答案 1 :(得分:0)

实际上找到了答案......

问题是我从JSON文件中提取了主体页面JSON格式的模板。然后为每个图像URL复制一次该模板。

我想因为我只阅读了一次JSON文件并复制了这些信息,所以这些副本都是统一的。

为了解决这个问题,我刚刚编写了一个函数,它接受JSON文件路径和图像URL作为输入。然后,该函数读取正文模板的JSON文件并插入图像URL。输出是生成的主体JSON格式,其中插入了图像URL。

由于此函数为其插入的每个图像读取一次JSON文件,因此可以避免我之前遇到的错误。