Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 根据列表和字典制作一本词典_Python 3.x_List_Dictionary - Fatal编程技术网

Python 3.x 根据列表和字典制作一本词典

Python 3.x 根据列表和字典制作一本词典,python-3.x,list,dictionary,Python 3.x,List,Dictionary,我正在尝试创建一个代码字典,用于查询和选择。假设我有一本州名称词典和相应的FIPS代码: statedict ={'Alabama': '01', 'Alaska':'02', 'Arizona': '04',... 'Wyoming': '56'} 然后我有一个从地图服务器请求中提取的FIPS代码列表: fipslist = ['02121', '01034', '56139', '04187', '02003', '04023', '02118'] 我想将字典中的键(基于该键值的前2个

我正在尝试创建一个代码字典,用于查询和选择。假设我有一本州名称词典和相应的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)

包含嵌套理解的一行代码:

>>> {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']}

您必须创建一个新列表,以保存每个州的匹配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']}

对于两种建议的解决方案,我需要一个反向状态字典(我假设每个状态正好有一个2位代码):

基于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]))}

啊,相互作用。我必须更仔细地研究这些解决方案。这很有效,我使用了它,因为它是最简洁的解决方案。谢谢
from itertools import groupby

{reverse_state_dict[k]: list(v) for k,v 
            in (groupby(sorted(fipslist), key=lambda x:x[:2]))}