从列表和字典中创建一个字典

4
我正在尝试创建一个代码字典,以便进行查询和选择。假设我有一个州名称和相应的FIPS代码的字典:
 statedict ={'Alabama': '01', 'Alaska':'02', 'Arizona': '04',... 'Wyoming': '56'}

然后我有一个FIPS代码列表,这是从地图服务器请求中获取的:

fipslist = ['02121', '01034', '56139', '04187', '02003', '04023', '02118']

我希望将字典中键的值(基于该键值的前两个字符)与列表项结合起来(同样,基于该键值的前两个字符。例如,所有以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)
3个回答

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

1
你需要创建一个新的列表来保存每个州匹配的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
对于这两个方案,我需要一个反转的状态字典(假设每个状态都有一个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]))}

啊,intertools。我得更仔细地看看那个解决方案。 - gwydion93

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接