#python #arrays #json #sorting
#python #массивы #json #сортировка
Вопрос:
Быстрый вопрос о работе со списком Json.
У меня есть данные json, которые имеют следующий формат
[
"fruits",
"apple",
"{n "color": "red",n "harvest": "ready"n}n",
"{n "color": "green",n "harvest": "not ready"n}n",
"veggies",
"spinach"
"{n "color": "green",n "harvest": "not ready"n}n",
"{n "color": "light green",n "harvest": "not ready"n}n"
]
Я хотел перенести любую строку, которая находится перед «{» (пример: яблоко и шпинат), в «Ключ-значение» и добавить статические «ключи», такие как «имя» и «функции», в json, наконец, это будет выглядеть примерно так:
{
"fruits":{"name":"apple",
"features":[
{
"color":"red",
"harvest":"ready"
}",
{"color":"green"
"harvest":"not ready"
]},
"veggies":{"name":"spinach",
"features":[
{
"color":"green",
"harvest":"notready"
},
{
"color":"light green",
"harvest":"not ready"
]}
}
Комментарии:
1. Как вы получаете этот JSON? это в файле json? или хранятся в переменной через строку? Я спрашиваю, потому что у вас есть возврат каретки » n».
2. я получаю через строку
3. всегда ли каждый элемент находится в своей собственной строке?
4. да, каждый элемент в отдельной строке. спасибо за проверку
Ответ №1:
Несколько советов, которые подскажут вам, как действовать дальше:
С предоставленным вами списком строк (я думаю, что после этого не хватает одной запятой "spinach"
)
strings = [
"fruits",
"apple",
"{n "color": "red",n "harvest": "ready"n}n",
"{n "color": "green",n "harvest": "not ready"n}n",
"veggies",
"spinach",
"{n "color": "green",n "harvest": "not ready"n}n",
"{n "color": "light green",n "harvest": "not ready"n}n"
]
это
import json
items = []
for string in strings:
try:
items.append(json.loads(string))
except:
items.append(string)
дает вам ( print(items)
) следующий список:
['fruits',
'apple',
{'color': 'red', 'harvest': 'ready'},
{'color': 'green', 'harvest': 'not ready'},
'veggies',
'spinach',
{'color': 'green', 'harvest': 'not ready'},
{'color': 'light green', 'harvest': 'not ready'}]
Теперь это
results = {}
items = iter(items)
while True:
try:
category = next(items)
except StopIteration:
break
results[category] = {
'name': next(items),
'features': [next(items), next(items)]
}
производит ( print(results)
)
{'fruits': {'features': [{'color': 'red', 'harvest': 'ready'},
{'color': 'green', 'harvest': 'not ready'}],
'name': 'apple'},
'veggies': {'features': [{'color': 'green', 'harvest': 'not ready'},
{'color': 'light green', 'harvest': 'not ready'}],
'name': 'spinach'}}
Пока все хорошо, но я подозреваю, что ваш список строк на самом деле длиннее. Скорее всего, он содержит другие фрукты или овощи, которые должны быть включены в результат. Для этого вам необходимо соответствующим образом настроить структуру программы (включая структуру результатов).