Есть ли какой-нибудь способ получить ключ из значений в python?(словарь)

#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)