Вставить значения из списка в 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'}]