合并多个词典和列表中的数据

时间:2018-08-02 15:54:39

标签: python list dictionary for-loop conditional

假设我有一个国家缩写词典和相应的名称:

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])

3 个答案:

答案 0 :(得分:2)

我使用了defaultdict模块中的collections。基本上,您提供了一个callable,如果找不到它,它将设置初始值:

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'])

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

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

答案 1 :(得分:1)

您可以将setdefault方法用于字典以简化任务

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

答案 2 :(得分:0)

先反转您的状态词典

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