Вставить значения из списка в json

У меня есть вложенный JSON, который выглядит так:

[
    {
        'Name':'Anders', 
        'Type':'Hunter', 
        'Race':'Cyborg', 
    },
    {
        'Name':'Karin', 
        'Type':'Titan', 
        'Race':'Human', 
    },
    {
        'Name':'Jenny', 
        'Type':'Warlock', 
        'Race':'Marsian', 
    },
]

И у меня есть строка, которая выглядит так:

['1', 'Ham', 'Spam', 'Bacon', '1', 'Ham', 'Cucumber', 'Tomato', '1', 'Wood', 'Potato', 'Herring']

Я хочу вставить строку в JSON с именем для значения. Каждые четыре в строке для каждого человека в JSON.

Конечный результат должен выглядеть так:

    [
    {
        'Name':'Anders', 
        'Type':'Hunter', 
        'Race':'Cyborg',
        'string1':'1',
        'Food_1':'Ham',
        'Food_2':'Spam',
        'Food_3':'Bacon',
    },
    {
        'Name':'Karin', 
        'Type':'Titan', 
        'Race':'Human',
        'string1':'1',
        'Food_1':'Ham',
        'Food_2':'Cucumber',
        'Food_3':'Tomato',
    },
    {
        'Name':'Jenny', 
        'Type':'Warlock', 
        'Race':'Marsian',
        'string1':'1',
        'Food_1':'Wood',
        'Food_2':'Potato',
        'Food_3':'Herring',     
    },
]

Я пробовал с некоторыми итерациями, но все время терпит неудачу:/

Надеюсь, вы можете помочь мне!

3 ответа

Я предполагаю, что ваши структуры данных - это python dicts и списки, а не строки, содержащие json-текст.

Во-первых, включите ваш плоский список вещей, чтобы вставить их в список по 4 элемента в каждом. Вы можете прочитать о некоторых других способах сделать это здесь.

new_things = ['1', 'Ham', 'Spam', 'Bacon', '1', 'Ham', 'Cucumber', 'Tomato', '1', 'Wood', 'Potato', 'Herring']
chunks = [new_things[i:i+4] for i in range(0, len(new_things), 4)]

В результате чего:

[['1', 'Ham', 'Spam', 'Bacon'], ['1', 'Ham', 'Cucumber', 'Tomato'], ['1', 'Wood', 'Potato', 'Herring']]

Затем выполните итерацию по двум коллекциям одновременно. Вы можете использовать zip для этого:

for entry, new_stuff in zip(existing_data, chunks):
    entry["string1"] = new_stuff[0]
    entry["Food_1"] = new_stuff[1]
    entry["Food_2"] = new_stuff[2]
    entry["Food_3"] = new_stuff[3]

После этого ваша коллекция должна выглядеть ожидаемой.

Компактный способ сделать это - использовать iter а также zip функции, чтобы разбить новые данные на куски.

import json

data = [
    {
        'Name':'Anders', 
        'Type':'Hunter', 
        'Race':'Cyborg', 
    },
    {
        'Name':'Karin', 
        'Type':'Titan', 
        'Race':'Human', 
    },
    {
        'Name':'Jenny', 
        'Type':'Warlock', 
        'Race':'Marsian', 
    },
]

keys = ['string1', 'Food_1', 'Food_2', 'Food_3']
new_data = [
    '1', 'Ham', 'Spam', 'Bacon', 
    '1', 'Ham', 'Cucumber', 'Tomato', 
    '1', 'Wood', 'Potato', 'Herring',
]

# Create an iterator that yields chunks of length 4 from new_data
chunks = zip(*[iter(new_data)] * 4)

# Update the dicts in data with the new data
for d, t in zip(data, chunks):
    d.update(zip(keys, t))

# Convert to JSON
json_data = json.dumps(data, indent=4)
print(json_data)

выход

[
    {
        "Name": "Anders",
        "Type": "Hunter",
        "Race": "Cyborg",
        "string1": "1",
        "Food_1": "Ham",
        "Food_2": "Spam",
        "Food_3": "Bacon"
    },
    {
        "Name": "Karin",
        "Type": "Titan",
        "Race": "Human",
        "string1": "1",
        "Food_1": "Ham",
        "Food_2": "Cucumber",
        "Food_3": "Tomato"
    },
    {
        "Name": "Jenny",
        "Type": "Warlock",
        "Race": "Marsian",
        "string1": "1",
        "Food_1": "Wood",
        "Food_2": "Potato",
        "Food_3": "Herring"
    }
]

Мы могли бы также поставить "чанкинг" в основной for цикл:

for d, t in zip(data, zip(*[iter(new_data)] * 4)):
    d.update(zip(keys, t))

но я думаю, что предыдущая версия немного более читабельна.

Альтернатива для ответа 1:

json_list = [
    {
        'Name':'Anders', 
        'Type':'Hunter', 
        'Race':'Cyborg', 
    },
    {
        'Name':'Karin', 
        'Type':'Titan', 
        'Race':'Human', 
    },
    {
        'Name':'Jenny', 
        'Type':'Warlock', 
        'Race':'Marsian', 
    },]
foods = ['1', 'Ham', 'Spam', 'Bacon', '1', 'Ham', 'Cucumber', 'Tomato', '1', 'Wood', 'Potato', 'Herring']
for _ in json_list:
    _.update({'string1': foods[0], 'food_1': foods[1], 'food_2': foods[2], 'food_3': foods[3]})
    foods = foods[4:]
json_list

Результаты в

[{'Race': 'Cyborg', 'food_3': 'Bacon', 'string1': '1', 'food_2': 'Spam', 'Name': 'Anders', 'Type': 'Hunter', 'food_1': 'Ham'}, {'Race': 'Human', 'food_3': 'Tomato', 'string1': '1', 'food_2': 'Cucumber', 'Name': 'Karin', 'Type': 'Titan', 'food_1': 'Ham'}, {'Race': 'Marsian', 'food_3': 'Herring', 'string1': '1', 'food_2': 'Potato', 'Name': 'Jenny', 'Type': 'Warlock', 'food_1': 'Wood'}]
Другие вопросы по тегам