Python 3.8: Проблемы с поиском во вложенных списках и словарях - PullRequest
0 голосов
/ 09 июля 2020

Я получаю доступ к данным через API и получаю данные во вложенных словарях и списках.

Я пытаюсь получить список местоположений, выполнив поиск «unitaryAuthArea» в этом вложенном наборе data.

Единственный результат, который я получаю: Sites - это словарь.

Python 3.8

sites={'Locations': {'Location':[{'elevation': '50.0', 'id': '14', 'latitude': '54.9375', 'longitude': '-2.8092', 'name': 'Carlisle Airport', 'region': 'nw', 'unitaryAuthArea': 'Cumbria'},{'elevation': '108.0', 'id': '355874', 'latitude': '52.415775', 'longitude': '-4.059387', 'name': 'Penglais School', 'region': 'wl', 'unitaryAuthArea': 'Ceredigion'},{'elevation': '75.0', 'id': '3930', 'latitude': '51.55138', 'longitude': '-2.55933', 'name': 'Almondsbury', 'region': 'sw', 'unitaryAuthArea': 'South Gloucestershire'},{'elevation': '22.0', 'id': '26', 'latitude': '53.3336', 'longitude': '-2.85', 'name': 'Liverpool John Lennon Airport', 'region': 'nw', 'unitaryAuthArea': 'Merseyside'}]}}
 
srch='unitaryAuthArea'
 
def nested_extract(nested_sites, key):
    for k, v in nested_sites.items():
        if isinstance(k, dict):
            print('\n K is a dictionary')
            nested_extract(k,key)
        if isinstance(k, list):
            print('\n K is a list')
            if isinstance([0], dict):
                print('\n K is an Inner dictionary')
                nested_extract([0],key)
        if k == key:
            print(v)
         
 
if isinstance(sites, dict):
    print('\n Sites is a dictionary')
    nested_extract(sites,srch)
else:
    print('\n Sites is NOT a dictionary')

Большое спасибо. Дэйв

Ответы [ 3 ]

1 голос
/ 09 июля 2020

Немного изменил l oop, чтобы проверить v вместо k. И l oop если список.

sites={'Locations': {'Location':[{'elevation': '50.0', 'id': '14', 'latitude': '54.9375', 'longitude': '-2.8092', 'name': 'Carlisle Airport', 'region': 'nw', 'unitaryAuthArea': 'Cumbria'},{'elevation': '108.0', 'id': '355874', 'latitude': '52.415775', 'longitude': '-4.059387', 'name': 'Penglais School', 'region': 'wl', 'unitaryAuthArea': 'Ceredigion'},{'elevation': '75.0', 'id': '3930', 'latitude': '51.55138', 'longitude': '-2.55933', 'name': 'Almondsbury', 'region': 'sw', 'unitaryAuthArea': 'South Gloucestershire'},{'elevation': '22.0', 'id': '26', 'latitude': '53.3336', 'longitude': '-2.85', 'name': 'Liverpool John Lennon Airport', 'region': 'nw', 'unitaryAuthArea': 'Merseyside'}]}}

srch='unitaryAuthArea'

def nested_extract(nested_sites, key):
    for k, v in nested_sites.items():
        if isinstance(v, dict):
            print('\n V is a dictionary')
            nested_extract(v, key)
        if isinstance(v, list):
            print('\n V is a list')
            for elem in v:
                nested_extract(elem, key)
        if k == key:
            print(v)

if isinstance(sites, dict):
    print('\n Sites is a dictionary')
    nested_extract(sites,srch)
else:
    print('\n Sites is NOT a dictionary')
1 голос
/ 09 июля 2020

Это то, что вы ищете, когда говорите, что хотите получить список местоположений, выполнив поиск по "unitaryAuthArea"? Это работает, только если структура остается прежней. Я добавил оператор if в понимание списка, чтобы убедиться, что вы не получите сообщение об ошибке, если ваше ключевое слово «unitaryAuthArea» отсутствует в dict. Надеюсь, это поможет тебе. Если вы ищете что-то еще, просто дайте мне комментарий.

sites ={'Locations': {'Location' :
    [{'elevation': '50.0', 'id': '14', 'latitude': '54.9375', 'longitude': '-2.8092', 'name': 'Carlisle Airport', 'region': 'nw', 'unitaryAuthArea': 'Cumbria'}
    ,{'elevation': '108.0', 'id': '355874', 'latitude': '52.415775', 'longitude': '-4.059387', 'name': 'Penglais School', 'region': 'wl', 'unitaryAuthArea': 'Ceredigion'}
    ,{'elevation': '75.0', 'id': '3930', 'latitude': '51.55138', 'longitude': '-2.55933', 'name': 'Almondsbury', 'region': 'sw', 'unitaryAuthArea': 'South Gloucestershire'}
    ,{'elevation': '22.0', 'id': '26', 'latitude': '53.3336', 'longitude': '-2.85', 'name': 'Liverpool John Lennon Airport', 'region': 'nw', 'unitaryAuthArea': 'Merseyside'}]}}

srch ='unitaryAuthArea'

results = [location['unitaryAuthArea'] for location in sites['Locations']['Location'] if location.get('unitaryAuthArea', False)]

print(results)
#output: ['Cumbria', 'Ceredigion', 'South Gloucestershire', 'Merseyside']
0 голосов
/ 09 июля 2020

Вам следует выполнять итерацию по значению, а не по ключу:

if isinstance(v, dict):
      print('\n V is a dictionary')
      nested_extract(v, key)
if isinstance(v, list):
      print('\n V is a list')
      if isinstance(v[0], dict):
           print('\n V is an Inner dictionary')
           nested_extract(v[0], key)

И затем вместо [0] итерации по каждому значению списка:

if isinstance(v, dict):
    print('\n V is a dictionary')
    nested_extract(v, key)
if isinstance(v, list):
    print('\n V is a list')
    for x in v:
        if isinstance(x, dict):
            print('\n X is an Inner dictionary')
            nested_extract(x, key)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...