Разбор вложенных списков списков и Dicts в Python - PullRequest
0 голосов
/ 04 ноября 2018

Я использую клиент Python google maps для получения данных геокодирования. API возвращает список, который выглядит как список списков и диктов. Вот пример одного результата.

[[{'address_components': [{'long_name': 'Liverpool',
 'short_name': 'Liverpool',
 'types': ['locality', 'political']},
{'long_name': 'Merseyside',
 'short_name': 'Merseyside',
 'types': ['administrative_area_level_2', 'political']},
{'long_name': 'England',
 'short_name': 'England',
 'types': ['administrative_area_level_1', 'political']},
{'long_name': 'United Kingdom',
 'short_name': 'GB',
 'types': ['country', 'political']}]

Это продолжается некоторое время, а затем новый список начинается с address_components, немного вниз. В середине каждого результата есть 'location':{'lat':xxx, 'lng':xxx},

'location': {'lat': 53.4083714, 'lng': -2.9915726},
'location_type': 'APPROXIMATE',
'viewport': {'northeast': {'lat': 53.503907, 'lng': -2.8129382},
 'southwest': {'lat': 53.3204478, 'lng': -3.0191793}}}

Я пытаюсь получить это значение для 'lat' и lng.

Я попытался разобрать это несколькими способами. Например:

example = [[{'address_components': [{'long_name': 'Liverpool',
 'short_name': 'Liverpool',
 'types': ['locality', 'political']},
{'long_name': 'Merseyside',
 'short_name': 'Merseyside',
 'types': ['administrative_area_level_2', 'political']},
{'long_name': 'England',
 'short_name': 'England',
 'types': ['administrative_area_level_1', 'political']},
{'long_name': 'United Kingdom',
 'short_name': 'GB',
 'types': ['country', 'political']}]

Я попытался разобрать так:

for x in example[i]: for t in x: print(t)

это возвращает:

address_components
formatted_address
geometry
place_id
types

Теперь, мои lat и lng находятся в этом geometry, вот так:

'geometry': {'bounds': {'northeast': {'lat': 53.503907, 'lng': -2.8129382},
 'southwest': {'lat': 53.3204478, 'lng': -3.0191793}}

Но если я попытаюсь расширить цикл for, чтобы он выглядел так:

for x in source_ll[i]: for t in x: for z in t: print(z)

выводит: a d d r e s s _ c o m p o n e n t s f o r m a и так далее. Которые являются строками, составляющими то, что было возвращено с for t in x.

Обновление Я попробовал:

for x in example[i]: for t in x: for value in ['geometry']: print(value)

Но это возвращается geometry n раз.

Я просто хочу получить 53.4083714 и -2.9915726.

Я понимаю, что мне нужна твоя помощь !!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

#for key1, value1 in target_query.items(): try: for entities in value1: if isinstance(entities, dict): for key2, value2 in entities.items(): if isinstance(value2, dict): for key3, value3 in value2.items(): if isinstance(value3, dict): for key4, value4 in value3.items():<br> if isinstance(value4, dict):<br> x = value4.get('lat') x = str(x) y = value4.get('lng') y = str(y)

0 голосов
/ 04 ноября 2018

Когда вы делаете for c in some_string: print(c), вы просто печатаете some_string символ за раз, каждый на отдельной строке. Вместо этого вы хотите что-то вроде следующего, где обработка записей геометрии основана на вашем примере выше.

        if t == 'geometry':
            bnd = t['bounds']
            ne = bnd['northeast']
            sw = bnd['southwest']
            [print('ne', ne['lat'], ne['lng'], 'sw', sw['lat'], sw['lng']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...