Удалить весь вложенный dict, обнаружив, есть ли значение в списке - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь составить карту значений в почтовых индексах США.У меня есть файл JSON с точками для области ZCTA5CE, которая соответствует каждому почтовому индексу.Я использую пакет Folium.

В настоящее время отображение работает, но мучительно медленно - 10 секунд в зависимости от других элементов, работающих на моем компьютере, и делает невозможным взаимодействие с картой путем скольжения и масштабирования - из-за размераJSON-файл (482,2M) и, таким образом, в результате dict.

Данные, которые я хочу построить, не содержат информации для всех почтовых индексов, поэтому я хотел бы удалить информацию в диктовке почтового индекса, связанную с теми почтовыми индексами, которые не в моих данных.

Мой вопрос таков: как я могу перебрать диктовку информации о почтовом индексе и удалить диктанты, которых нет в указанном мною списке почтовых индексов.

Чтобы прояснить структуру диктата, с которым я работаю:

zip_code_geo_dict.keys() дает:

dict_keys(['type', 'features'])

где zip_code_geo_dict['type'] является строкой, а zip_code_geo_dict['features'] является списком.

Теперь zip_code_geo_dict['features'][0] - это:

{'type': 'Feature','geometry': {'type': 'MultiPolygon',
'coordinates': [[[[-88.252618, 32.92675],
[-88.249724, 32.93242],
**bajillions of lines of coordinates here**
[-88.34043199999999, 32.991199]]]]},
'properties': {'ZCTA5CE10': '35442',
'AFFGEOID10': '8600000US35442',
'GEOID10': '35442',
'ALAND10': 610213891,
'AWATER10': 10838694}}

Мои исходные данные могут измениться, поэтому фактический список почтовых индексов, которые я хочу отобразить, является динамическим.Тем не менее, я всегда могу создать список:

zips_of_interest = ['15210', '15222'] 

Как я могу перебрать zip_code_geo_dict, чтобы удалить информацию о координатах на основе zip_code_geo_dict['features']['properties']['ZCTA5CE10'] NOT IN zips_of_interest?Необходимо сохранить общую структуру dict, чтобы отфильтрованная версия zip_code_geo_dict['features'] находилась в том же «месте», что и оригинал (она должна быть dict в качестве второго ключа в более крупном zip_code_geo_dict объекте).

Я думаю, уместно отметить, что я хотел бы сохранить базовую структуру dict, потому что я собираюсь передать ее методу choropleth в Folium.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Не уверен, что это то, что вы ищете.У сообщения, которое вы разместили, нет ключа функции.Я составил дополнительный диктовку, которая не будет удалена предложенной вами логикой, и поместил оба диктанта в список, чтобы обеспечить полную демонстрацию.

def filter_zips(geo_list, zip_list):
    result = geo_list.copy()
    for i, zip_code_geo_dict in enumerate(result):
        if zip_code_geo_dict['properties']['ZCTA5CE10'] not in zip_list:
            del result[i]
    return result

zip_code_geo_list = [
    {
        'type': 'Feature',
        'geometry': {
            'type': 'MultiPolygon',
            'coordinates': [
                [-88.252618, 32.92675],
                [-88.249724, 32.93242],
                [-88.34043199999999, 32.991199]
            ]
        },
        'properties': {
            'ZCTA5CE10': '35442',
            'AFFGEOID10': '8600000US35442',
            'GEOID10': '35442',
            'ALAND10': 610213891,
            'AWATER10': 10838694
        }
    },
    {
        'type': 'Feature',
        'geometry': {
            'type': 'MultiPolygon',
            'coordinates': [
                [-88.252618, 32.92675],
                [-88.249724, 32.93242],
                [-88.34043199999999, 32.991199]
            ]
        },
        'properties': {
            'ZCTA5CE10': '35442',
            'AFFGEOID10': '8600000US35442',
            'GEOID10': '15210',
            'ALAND10': 610213891,
            'AWATER10': 10838694
        }
    },
]
zips_of_interest = ['15210', '15222']

filter_zips(zip_code_geo_list, zips_of_interest)

filter_zips() в этом случае вернет списокс первым удаленным диктом и вторым оставшимся.

0 голосов
/ 21 сентября 2018

Если информация о почтовом индексе может измениться, мое первое предложение - использовать что-то вроде RTree, KDTree или BallTree для хранения информации в структуре, обеспечивающей легкий доступ по регионам.Это дает вам возможность эффективно создавать запросы типа «какие почтовые индексы находятся в радиусе r радиуса моего интереса?».

Что касается фактической реализации фильтра, если у вас многоиз почтовых индексов вы, вероятно, захотите сделать что-то вроде lookup = set(zips_of_interest), чтобы вы могли искать включение в O (1) вместо O (n).Для len(zips_of_interest)<15 или около того, список, вероятно, подходит (во многом зависит от вашей платформы).

Вы упоминаете, что «первый элемент» zip_code_geo_dict - это [такой-то и такой-то].Какой тип zip_code_geo_dict?Это дикт?Фильтрация вещей из этого зависит от того, что именно.Тем не менее, для общих структур данных у вас в основном уже написана команда.

lookup = set(zip_code_geo_dict)

Dict

condensed_data = {k:zip_code_geo_dict[k] for k in zip_code_geo_dict
                  if zip_code_geo_dict[k]['properties']['ZCTA5CE10'] in lookup}

Список

condensed_data = [v for v in zip_code_geo_dict
                  if v['properties']['ZCTA5CE10'] in lookup]

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

...