【问题标题】:Making a dictionary of from a list and a dictionary从列表和字典中制作字典
【发布时间】:2018-08-27 23:32:55
【问题描述】:

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

【问题讨论】:

    标签: python-3.x list dictionary


    【解决方案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']}
    

    【讨论】:

    • 这很好,我使用它,因为它是最简洁的解决方案。谢谢。
    【解决方案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']}
    

    【讨论】:

      【解决方案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]))}
      

      【讨论】:

      • 啊,工具间。我将不得不更仔细地研究这些解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 2016-09-24
      • 2016-06-09
      • 1970-01-01
      • 2017-05-05
      • 2020-07-14
      相关资源
      最近更新 更多