Определение местоположения элемента в файле json

#python #json #dictionary #indexing #dictionary-comprehension

#python #json #словарь #индексирование #словарь-понимание

Вопрос:

Предположим, у меня есть следующий файл json. С data1["tenants"][1]['name'] помощью я могу выбрать uniquename2. Есть ли способ собрать число ‘1’ путем перебора документа?

 {
    "tenants": [{
            "key": "identifier",
            "name": "uniquename",
            "image": "url",
            "match": [
                "identifier"
            ],
            "tags": [
                "tag1",
                "tag2"
            ]
        },
        {
            "key": "identifier",
            "name": "uniquename2",
            "image": "url",
            "match": [
                "identifier1",
                "identifier2"
            ],
            "tags": ["tag"]
        }
    ]
}
 

короче говоря: data1["tenants"][1]['name'] = uniquename2 data1["tenants"][0]['name'] = uniquename
Как я могу узнать, какой номер имеет какое имя. Итак, если у меня есть uniquename2, какой номер / индекс соответствует ему?

Ответ №1:

вы можете перебирать арендаторов, чтобы сопоставить индекс с именем

 data = {
    "tenants": [{
            "key": "identifier",
            "name": "uniquename",
            "image": "url",
            "match": [
                "identifier"
            ],
            "tags": [
                "tag1",
                "tag2"
            ]
        },
        {
            "key": "identifier",
            "name": "uniquename2",
            "image": "url",
            "match": [
                "identifier1",
                "identifier2"
            ],
            "tags": ["tag"]
        }
    ]
}

for index, tenant in enumerate(data['tenants']):
    print(index, tenant['name'])
 

ВЫВОД

 0 uniquename
1 uniquename2
 

Ответ №2:

Предполагая, что вы уже превратили свой json в словарь, вот как вы можете получить индекс первого появления имени в вашем списке (это зависит от того, что имена действительно уникальны):

 data = {
    "tenants": [{
            "key": "identifier",
            "name": "uniquename",
            "image": "url",
            "match": [
                "identifier"
            ],
            "tags": [
                "tag1",
                "tag2"
            ]
        },
        {
            "key": "identifier",
            "name": "uniquename2",
            "image": "url",
            "match": [
                "identifier1",
                "identifier2"
            ],
            "tags": ["tag"]
        }
    ]
}

def index_of(tenants, tenant_name):
    try:
        return tenants.index(
            next(
                tenant for tenant in tenants
                if tenant["name"] == tenant_name
            )
        )
    except StopIteration:
        raise ValueError(
            f"tenants list does not have tenant by name {tenant_name}."
        )

index_of(data["tenants"], "uniquename")  # 0