查询具有重复条目的复杂嵌套字典

时间:2017-07-11 21:00:01

标签: python loops dictionary

我实际上是在编写一个程序,它将使用给定嵌套字典中的信息自动生成pdf。我已经进行了广泛的搜索,找不到适合我需要的方法,并且很容易从外部角度看。我的主要问题和疑问是:

  

使用嵌套字典,其中一些键有多个值,怎么做   我是否按顺序完全提取相关信息?

为了演示问题和目标,我将使用我在上一个问题中使用的以下嵌套字典进行说明:

{'Earth': 
    {'Northern Hemisphere': 
        {'North America': 
            {'The United States of America': 
                {'California': 'Sacramento', 
                 'Kentucky': 'Frankfurt', 
                 'Colorado': 'Denver', 
                 'Oregon': 'Salem', 
                 'Florida': 'Tallahassee', 
                 'Nevada': 'Carson City'
                 }
            }
        },
            {'Canada':
                {'Ontario': 'Toronto',
                 'Alberta': 'Edmonton',
                 'Manitoba': 'Winnipeg',
                 'Sasketchewan': 'Regina'
                 }
            }
     }
}

根据我的知识解决这个问题的最有效方法是使用for循环遍历字典并沿途填写pdf。最终结果会像任意一样:

Begin PDF

Planet: 'Earth'
Section:'Northern Hemisphere'
Country: 'The United State of America'
SubCategory: 'California': 'Sacramento', 
             'Kentucky': 'Frankfurt', 
             'Colorado': 'Denver', 
             'Oregon': 'Salem', 
             'Florida': 'Tallahassee', 
             'Nevada': 'Carson City'

Planet: 'Earth'
Section: 'Northern Hemisphere'
Country: 'Canada'
SubCategory: 'Ontario': 'Toronto',
             'Alberta': 'Edmonton',
             'Manitoba': 'Winnipeg',
             'Sasketchewan': 'Regina'

End PDF

格式化PDF不是我遇到的问题,我在某种程度上已经弄明白了。我的问题是理解如何阅读这个嵌套字典的方式,使Northern Hemisphere之类的键被理解为附加了两个或更多的值,并且Earth之类只有一个值的键被理解属于Country个条目。

我希望我的问题清楚,任何帮助都表示赞赏。

1 个答案:

答案 0 :(得分:1)

  

问题:...嵌套字典...我如何...以顺序方式提取...?

注意
您的嵌套词典接近json,为什么不使用JSON?
您的dict 无效国家/地区 Canada必须位于部分 Northern Hemisphere内。

递归解决方案,使用GeneratorType
输出是dict,其中包含keys中给定键的所有值。

def Earth_nested_dict():
    keys = ['Planet',' Section', None, ' Country', 'SubCategory']
    _record = OrderedDict()

    def _nested_dict(_dict, key, deep):
        if isinstance(_dict, dict):
            if keys[deep]:
                _record[keys[deep]] = key
            for k in _dict:
                yield from _nested_dict(_dict[k], k, deep + 1)
        else:
            _record[keys[deep]] = '{}:{}'.format(key, _dict)
            yield _record

    yield from _nested_dict(nested_dict['Earth'], 'Earth', 0)

<强>用法:

for _record in Earth_nested_dict():
    print(_record)
  

<强>输出

OrderedDict([('Planet', 'Earth'), (' Section', 'Northern Hemisphere'), (' Country', 'The United States of America'), ('SubCategory', 'Oregon:Salem')])
... (omitted for brevity)
OrderedDict([('Planet', 'Earth'), (' Section', 'Northern Hemisphere'), (' Country', 'Canada'), ('SubCategory', 'Alberta:Edmonton')])
... (omitted for brevity)
OrderedDict([('Planet', 'Earth'), (' Section', 'Southern Hemisphere'), (' Country', 'Brazil'), ('SubCategory', 'Bahia:Salvador')])

使用Python测试:3.4.2