#python #json #dictionary
Вопрос:
Этот вопрос кажется немного странным, так как я знаю, что словари не предназначены для использования на основе значений, а не ключей.Недавно я столкнулся с определенной проблемой, чтобы свести к минимуму процедуру заполнения формы, так как, если указаны города определенной страны, мне нужно автоматически заполнить страну и континент для этого пользователя. Я получил ссылку на Json для справки .
[{
"Asia": {
"Japan": [
"tokyo",
"hirohima",
]
}
},
{
"Europe": {
"England": [
"Manchester",
"London",
"South gate",
]
}
}
]
Предположим, Город пользователей-это Лондон. Могу ли я получить Англию и Европу в качестве выходных данных? или мой json формируется неправильно?
Комментарии:
1. Конечно, вам просто нужно будет повторить эти диктанты и найти список, в котором находится нужный вам город.
2. Предположим, что значения являются хэшируемыми, вы можете просмотреть данные один раз и создать обратный индекс. Существует сложность, поскольку значение может быть в нескольких словарях. Например, Лондон, Онтарио. Не знаю, как ты хочешь с этим справиться.
3. Возможно, вам не понадобится этот внешний список. В вашем примере он имеет только одно значение-диктант с Азией и Европой.
4. @tdelaney — Внешний список содержит 2 словаря. Один с ключом «Азия» и один с ключом «Европа»
5. Преобразуйте json в xml , затем используйте xpath/dom, чтобы получить все соответствующие предки.
Ответ №1:
Вы можете просмотреть данные и «перепроектировать» словарь:
city = "London"
for d in data:
for continent, countries in d.items():
for country, cities in countries.items():
if "London" in cities:
print(country, continent)
Ответ №2:
чтобы получить название страны и континента, ваш файл json должен быть в этой форме :
[{"ContinentName":"Asia","country":{"countryName":"Japan","cities":["tokyo","hirohima"]}},{"ContinentName":"Europe","country":{"countryName":"England","cities":["london","south gate","Manchester"]}}]
Комментарии:
1. спасибо за ответ, потому что это не был основной вопрос, заданный мной
2. лучше изменить форму json , если вы хотите позже преобразовать файл json в список объектов
Ответ №3:
Вы можете создать обратный индекс кортежей город-страна/регион. Поскольку названия городов не являются уникальными, у вас может быть одно и то же название города в нескольких странах. Вы можете решить эту проблему, индексировав список стран/регионов. Вы сделаете это один раз, когда получите данные, а затем их можно будет быстро просмотреть при необходимости.
from collections import defaultdict
data = [{
"Asia": {
"Japan": [
"tokyo",
"hirohima",
]
}
},
{
"Europe": {
"England": [
"Manchester",
"London",
"South gate",
]
}
}
]
reverse_index = defaultdict(list)
for region_dict in data:
for region, country_dict in region_dict.items():
for country, city_list in country_dict.items():
for city in city_list:
reverse_index[city].append((region, country))
for city, refs in reverse_index.items():
print(city, refs)