在python中添加到字典时,数组不断被替换

时间:2018-09-02 16:54:44

标签: python json list dictionary for-loop

我正在尝试制作一个JSON对象,该对象基本上是一个字典。这是我创建字典的代码:

# Adding the data to the JSONData object
JSONData[str(gerechtNaam)] = { 
    "afbeeldingURL": gerechtAfbeelding,
    "receptURL": recept,
    "prijs": totalePrijs,
    "porties": porties,
    "moeilijkheid" :moeilijkheid,
    "caloriePortie": calorien,
    "voorbereidingsTijd": voorbereidingsTijd,
    "wachtTijd": wachtTijd,
    "totaleTijd": totaleTijd,
    "ingredienten": naamEnKwantiteitIngredienten
}

这有效,并生成以下内容:

{
    'Gerooktekipsalade met avocado en walnoten': { 
        'afbeeldingURL': 'https://static-images.jumbo.com/product_images/Recipe_502535-01_560x560.jpg',
        'receptURL': 'http://www.jumbo.com/gerooktekipsalade-met-avocado-en-walnoten/502535/',
        'prijs': 16.868000000000002,
        'porties': '4 porties',
        'moeilijkheid': 'Eenvoudig',
        'caloriePortie': '842 kcal per persoon',
        'voorbereidingsTijd': '15 min',
        'wachtTijd': '0',
        'totaleTijd': '15 min',
        'ingredienten': [
            '2 kroppen minisla romaine ',
            '200 g cherrytomaatjes',
            '4 stengels bleekselderij',
            '2 friszoete handappels ',
            '380 g Nieuwe Standaard Kip gerookte kipfilet ',
            '2 bosuitjes',
            '2 avocado',
            '150 ml whisky-cocktailsaus',
            '3 el bieslook',
            '60 g walnoten',
            '1 stokbrood',
            '1 snufje peper'
        ]
    }
}

然后我使用以下代码进行转换:

with open('receptData.json', 'w') as outfile: json.dump(JSONData, outfile)

这有效,并生成了有效的JSON。唯一的问题是,当尝试在for循环中运行两次代码时,最后一个变量称为“ ingredienten”,这是在循环中创建的列表,将替换为词典中的所有对象。因此,当创建第二个“ ingredienten”数组时,已经制作并添加到JSONData中的“ ingredienten”数组将被新的替换。所有其他变量都保持正确,但是每次循环运行时都会替换列表/数组。

第二次运行代码,这就是我得到的字典:

{
    'Gerooktekipsalade met avocado en walnoten': {
        'afbeeldingURL': 'https://static-images.jumbo.com/product_images/Recipe_502535-01_560x560.jpg',
        'receptURL': 'http://www.jumbo.com/gerooktekipsalade-met-avocado-en-walnoten/502535/',
        'prijs': 16.868000000000002,
        'porties': '4 porties',
        'moeilijkheid': 'Eenvoudig',
        'caloriePortie': '842 kcal per persoon',
        'voorbereidingsTijd': '15 min',
        'wachtTijd': '0',
        'totaleTijd': '15 min',
        'ingredienten': **[
            '4 avocado',
            '100 g gerookte zalm',
            '8 kleine eieren ',
            '25 g alfalfa',
            '1 snufje peper',
            '1 bakplaat'
        ]**
    },
    'Gevulde avocado met ei en zalm uit de oven': {
        'afbeeldingURL': 'https://static-images.jumbo.com/product_images/Recipe_502536-01_560x560.jpg',
        'receptURL': 'http://www.jumbo.com/gevulde-avocado-met-ei-en-zalm-uit-de-oven/502536/',
        'prijs': 8.72,
        'porties': '4 porties',
        'moeilijkheid': 'Eenvoudig',
        'caloriePortie': '234 kcal per persoon',
        'voorbereidingsTijd': '10 min',
        'wachtTijd': '15 min',
        'totaleTijd': '25 min',
        'ingredienten': **[
            '4 avocado',
            '100 g gerookte zalm',
            '8 kleine eieren ',
            '25 g alfalfa',
            '1 snufje peper',
            '1 bakplaat'
        ]**
    }
}

第一个“成分”列表现在与第二个相同,而事实并非如此。我已经尝试了多种方法,但都无济于事。...

1 个答案:

答案 0 :(得分:1)

虽然您没有显示创建它的代码,但是我很确定问题在于您正在重用变量naamEnKwantiteitIngredienten,该变量是您用作由指向的值的列表字典中的'ingredienten'键。如果对该列表进行了适当的修改(也许通过用另一组成分填充该列表),并且还没有将其转储到JSON字符串中,那么您还将在先前的词典中看到修改后的版本。

我认为您可以通过两种主要方法来解决此问题。

一种方法是在创建字典后立即创建JSON,而不是稍后再等待。虽然这可能会解决此问题,但可能对您的程序造成不便(或者,如果出于其他原因需要同时定义所有字典,则不可能实现)。

另一种解决方案是确保您创建的字典彼此独立。不要确保在所有列表中重用同一列表,而应确保每个列表都包含一个单独的列表。解决此问题的最明显的地方可能是您创建以naamEnKwantiteitIngredienten结尾的值的任何地方,但是您可以通过在将其放入字典之前复制列表来在显示的代码中对其进行修复:

JSONData[str(gerechtNaam)] = { 
    "afbeeldingURL": gerechtAfbeelding,
    "receptURL": recept,
    "prijs": totalePrijs,
    "porties": porties,
    "moeilijkheid" :moeilijkheid,
    "caloriePortie": calorien,
    "voorbereidingsTijd": voorbereidingsTijd,
    "wachtTijd": wachtTijd,
    "totaleTijd": totaleTijd,
    "ingredienten": naamEnKwantiteitIngredienten[:]     # slice here to copy the list!
}