提问人:gwydion93 提问时间:8/28/2018 更新时间:8/28/2018 访问量:90
从列表和字典制作字典
Making a dictionary of from a list and a dictionary
问:
我正在尝试创建一个可用于查询和选择的代码字典。假设我有一本包含州名称和相应 FIPS 代码的字典:
statedict ={'Alabama': '01', 'Alaska':'02', 'Arizona': '04',... 'Wyoming': '56'}
然后,我有一个从地图服务器请求中提取的 FIPS 代码列表:
fipslist = ['02121', '01034', '56139', '04187', '02003', '04023', '02118']
我想将字典中的键(基于该键值的前 2 个字符)与列表项(也基于该键值的前 2 个字符)组合在一起。 例如,所有以 01 = 'Alabama' 开头的代码,等等......我的最终目标是这样的:
fipsdict ={'Alabama': ['01034'], 'Alaska':['02121', '02003','02118'], 'Arizona': ['04187', '04023'],... 'Wyoming': ['56139']}
我会尝试将其设置为与此类似,但它无法正常工作。有什么建议吗?
fipsdict = {}
tempList = []
for items in fipslist:
for k, v in statedict:
if item[:2] == v in statedict:
fipsdict[k] = statedict[v]
fipsdict[v] = tempList.extend(item)
答:
1赞
kevinkayaks
8/28/2018
#1
带有嵌套理解的单行:
>>> {k:[n for n in fipslist if n[:2]==v] for k,v in statedict.items()}
{'Alabama': ['01034'],
'Alaska': ['02121', '02003', '02118'],
'Arizona': ['04187', '04023'],
'Wyoming': ['56139']}
评论
1赞
gwydion93
8/29/2018
这效果很好,我使用了它,因为它是最简洁的解决方案。谢谢。
1赞
vaichidrewar
8/28/2018
#2
您必须创建一个新列表来保存每个州的匹配 fips 代码。以下是适合您情况的代码。
for state,two_digit_fips in statedict.items():
matching_fips = []
for fips in fipslist:
if fips[:2] == two_digit_fips:
matching_fips.append(fips)
state_to_matching_fips_map[state] = matching_fips
>>> print(state_to_matching_fips_map)
{'Alabama': ['01034'], 'Arizona': ['04187', '04023'], 'Alaska': ['02121', '02003', '02118'], 'Wyoming': ['56139']}
1赞
DYZ
8/28/2018
#3
对于这两个建议的解决方案,我都需要一个反向状态字典(我假设每个状态正好有一个 2 位代码):
reverse_state_dict = {v: k for k,v in statedict.items()}
一种基于 defaultdict
的方法:
from collections import defaultdict
fipsdict = defaultdict(list)
for f in fipslist:
fipsdict[reverse_state_dict[f[:2]]].append(f)
一种基于 groupby
和字典理解的方法:
from itertools import groupby
{reverse_state_dict[k]: list(v) for k,v
in (groupby(sorted(fipslist), key=lambda x:x[:2]))}
评论
0赞
gwydion93
8/29/2018
啊,互通工具。我必须更仔细地研究这些解决方案。
评论