【问题标题】:Merging data from multiple dictionaries and lists合并来自多个字典和列表的数据
【发布时间】:2019-01-10 11:16:44
【问题描述】:

假设我有一本州缩写词和相应名称的字典:

stateDict = {'AL': 'Alabama', 'AK': 'Alaska', 'AZ': 'Arizona', ...}

我还有一个包含州缩写的字典列表,以及其他数据,包括县和县 fips 代码:

stateList = [{'county': 'Los Angeles County', 'state': 'CA', 'fips': '06037', 'cid': '060655'}, {'county': 'Jasper County', 'state': 'AL', 'fips': '18073', 'cid': '180100'}, {'county': 'Lafayette Parish', 'state': 'LA', 'fips': '22055', 'cid': '220102'}, {'county': 'Carver County', 'state': 'AL', 'fips': '27019', 'cid': '275233'}, {'county': 'Bertie County', 'state': 'NC', 'fips': '37015', 'cid': '227344'}...]

正如您在上面看到的,'state': 'AL' 的条目不止一个。我在这里要做的是使用字典 1:stateDict,选择列表 stateList 中的所有条目作为“AL”,然后将州名称放入一个新列表中,其中包含 stateList 中显示的所有县 fips 代码“ AL'(或 stateDict 中的任何其他状态)。所以结果应该是这样的:

stateInfo = ['Alabama': {'01003', '01004', '01017'}, 'Alaska': {'02030', '02113', '02014'}...]

或者可能是这样(我不确定什么是合适的):

stateInfo = {'Alabama': ['01003', '01004', '01017'], 'Alaska': ['02030', '02113', '02014']...}

使用前面提到的方法,我会使用这样的东西,但是因为我正在为 stateInfo 提取数据,所以我有些困惑。有什么建议吗?

stateInfo = {}
for i in stateList:
    fips = []
    for j in stateDict:
        for k, v in stateDict:
            if 'state' in stateList[i] == k for stateDict[j]:
                stateInfo[stateDict[v]].append(stateList('fips'[v])

【问题讨论】:

    标签: python list dictionary for-loop conditional


    【解决方案1】:

    您可以使用字典的setdefault方法来简化任务

    stateInfo = {}
    for k in stateList:
        if 'state' in k:
            stateInfo.setdefault(stateDict[k['state']], []).append(v['fips'])
    

    【讨论】:

    • 这个解决方案有些问题。只是在我的问题中使用测试数据,我尝试在底部打印 (stateInfo),它只是产生了空字典。
    • 如果 k 中的 'state' 应该是道歉
    【解决方案2】:

    我使用了来自collections 模块的defaultdict。基本上你提供了一个可调用的,如果它没有找到,它将设置初始值:

    from collections import defaultdict
    
    state_dict = {'AL': 'Alabama', 'AK': 'Alaska', 'AZ': 'Arizona'}
    county_list = [{'county': 'Los Angeles County', 'state': 'CA', 'fips': '06037', 'cid': '060655'}, {'county': 'Jasper County', 'state': 'AL', 'fips': '18073', 'cid': '180100'}, {'county': 'Lafayette Parish', 'state': 'LA', 'fips': '22055', 'cid': '220102'}, {'county': 'Carver County', 'state': 'AL', 'fips': '27019', 'cid': '275233'}, {'county': 'Bertie County', 'state': 'NC', 'fips': '37015', 'cid': '227344'}]
    
    
    state_info = defaultdict(list)
    for county in county_list:
        state_info[state_dict[county['state']]].append(county['fips'])
    

    这假定county_list 中的每个state 值在state_dict 中都有一个对应的键。如果没有,您需要进行一些错误检查。

    另外,我更改了变量的名称以反映实际数据。

    【讨论】:

    • 对于state_info = defaultdict(list) 是list 假设是county_list?否则会引发TypeError: first argument must be callable or None 错误。
    • 不,应该是list,如上所示。如果键不存在,defaultdict 将调用第一个参数是什么,如:list() 并将其分配为值。
    • 我最终在我更大的代码中得到了这个工作。 Unbeknowest 对我来说,我有一个名为 list 的被遗忘的变量,它一直导致 TypeError。
    【解决方案3】:

    先反转你的状态字典

    stateDict = {v:k for k,v in stateDict.iteritems()}
    

    然后为每个状态找到“fips”并添加到字典中:

    outDict = {}
    for i in stateDict:
        outDict[i]=[j['fips'] for j in stateList if j['state'] == stateDict[i]]
    

    最后打印出来:

    print outDict
    

    【讨论】:

    • 请编辑您的答案以添加对您的代码如何工作以及它如何解决 OP 问题的解释。很多 SO 发帖人都是新手,看不懂你贴的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多