Python嵌套字典到列表列表

时间:2015-10-07 23:40:09

标签: python list dictionary recursion

我知道这已经有很多问题了,我试着阅读其中大​​部分,但仍然遇到麻烦......

我有嵌套词典

city = {'centerLatitude': '40',
 'centerLongitude': '-86',
 'listings': {'A Name Here': {'address': 'the address',
                                     'city': 'acity',
                                     'distance': 'AmillionMiles',
                                     'facility_id': '1234',
                                     'latitude': '34',
                                     'longitude': '-86',
                                     'price': 'tooMuch',
                                     'rating': 'supergreat',
                                     'size': "10'xAz'",
                                     'state': 'XY',
                                     'zip': '50505'}}}

我有这个递归的python函数(取自另一篇文章)

def grab_children(father):
local_list = []
for key, value in father.iteritems():
    local_list.append(key)
    local_list.extend(grab_children(value))
return local_list

使用

调用该函数
print grab_children(city)

我得到这个错误......而不是列表

Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    print grab_children(city)
  File "<pyshell#5>", line 5, in grab_children
    local_list.extend(grab_children(value))
  File "<pyshell#5>", line 3, in grab_children
    for key, value in father.iteritems():
AttributeError: 'str' object has no attribute 'iteritems'

从错误中我认为当函数再次调用自身时使用的value会发生一些事情,因为它看起来像是认为它是一个是的,没有.iteritems,但是运行它并打印type(value)它总是一本字典(就像它应该的那样)。

它适用于这本词典,也取自另一篇文章,我不明白这本词典的不同之处。

city = {'<Part: 1.1>': {'<Part: 1.1.1>': {'<Part: 1.1.1.1>': {}},
                 '<Part: 1.1.2>': {}},
 '<Part: 1.2>': {'<Part: 1.2.1>': {}, '<Part: 1.2.2>': {}},
 '<Part: 1.3>': {}}

我的问题是: 为什么我收到此错误?我如何克服错误?如果错误是由我的字典不同引起的,那又有什么不同呢?

3 个答案:

答案 0 :(得分:3)

注意样本中“leaves”都是“{}”。这是一个空洞的词典。在你的“城市”,你的叶子是弦。要使用此函数,而不是:

city = {'centerLatitude': '40'}

你必须写:

city = { 'centerLatitude': { '40' : {} } }

但是这个问题主题是“列表列表”,这不是您的示例代码所做的。您的示例代码返回单个列表。所以我不确定你想要什么作为输出。

答案 1 :(得分:1)

your function should be changed to check if value is a dict, error  
because you recursive function tries to run iteritems() on a value that isstring. 
if isinstance(value,dict): clause need to be added to this recursive function. 
Otherwise function eventually grabs a string..
         change items() to iteritems() if not python 3

    def grab_children(father):
        local_list = []
        for key, value in father.items():
            local_list.append(key)
            if isinstance(value,dict):
                local_list.extend(grab_children(value))
        return local_list

print(grab_children(city))

['centerLatitude', 'centerLongitude', 'listings', 'A Name Here', 'latitude', 'rating', 'zip', 'longitude', 'facility_id', 'size', 'city', 'distance', 'state', 'address', 'price']

答案 2 :(得分:0)

你永远不会停止。以下内容检索所有词典中的所有键:

def grab_children(father):
    local_list = []
    for key, value in father.iteritems():
        local_list.append(key)
        if type(value) is dict:
            local_list.extend(grab_children(value))
    return local_list