繁体   English   中英

通过查找值是否在列表中来删除整个嵌套字典

[英]Remove whole nested dict by finding if a value is in a list

我正在尝试在美国的邮政编码范围内绘制值的彩色映射。 我有一个json文件,其中包含对应于每个邮政编码的ZCTA5CE区域的要点。 我正在使用Folium软件包。

目前,该映射有效,但是非常慢-基于json文件的大小(482.2M),基于我的计算机上运行的其他项,仅需10分钟的时间,并且几乎无法通过滑动和缩放与地图进行交互从而产生了结果。

我要绘制的数据没有所有邮政编码的信息,因此我想删除与我数据中包含的那些邮政编码相关联的邮政编码字典中的信息。

我的问题是:如何遍历邮政编码信息字典并删除不在我指定的邮政编码列表中的字典。

为了更清楚地了解我正在使用的字典的结构:

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对象中的第二个键) 。

我认为有必要指出,我想保留该字典的基本结构,因为我要将其传递给Folium中的choropleth方法。

如果邮政编码信息可能会更改,我的第一个建议是使用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 ]。 zip_code_geo_dict是什么类型? 这是命令吗? 从其中过滤掉内容取决于其确切含义。 也就是说,对于常见的数据结构,您基本上已经编写了命令。

lookup = set(zip_code_geo_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从原始数据结构中获取您感兴趣的所有内容。

不知道这是您要找的东西。 您发布的字典没有功能键。 我编写了一个额外的字典,您所建议的逻辑将不会删除它,并将这两个字典都放在列表中以提供完整的演示。

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()将返回删除了第一个字典而剩下的第二个字典的列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM