Массив продолжает заменяться при добавлении в словарь в Python - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь создать объект 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 последний переменный, называемый 'Ingienienten', представляющий собой список, который создается в цикле, заменяется для всех объектов в словаре. Таким образом, при создании второго массива ингридиентов массив, который уже был создан и добавлен в JSONData, заменен новым. Все остальные переменные остаются правильными, но список / массив заменяется при каждом запуске цикла.

Итак, когда код запускается второй раз, я получаю следующий словарь:

{
    '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 голосов
/ 02 сентября 2018

Хотя вы не показали код, который его создает, я почти уверен, что проблема в том, что вы повторно используете переменную 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!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...