Python:如何遍历列表[Dict {List [Dict {}]}]

时间:2013-06-06 16:56:28

标签: python list loops dictionary traversal

我只是想知道是否有一种简单的方法可以做到这一点。我有一个从文件解析的特定结构,输出是一个dict列表的dict列表。目前,我只是有一些看起来像这样的代码:

for i in xrange(len(data)):
    for j, k in data[i].iteritems():
        for l in xrange(len(data[i]['data'])):
            for m, n in data[i]['data'][l].iteritems():
                dostuff()

我只是想知道是否有一个函数可以遍历一个结构,并在内部判断每个条目是一个列表还是一个字典,如果它是一个字典,则遍历该字典,依此类推。我只使用Python大约一个月左右,所以我决不是专家,甚至不是语言的中间用户。提前感谢您的答案。

编辑:即使可以简化我的代码,也会有所帮助。

4 个答案:

答案 0 :(得分:10)

从不需要遍历xrange(len(data))。您可以通过data(列表)或data.items()(或values())(对于词典)进行迭代。

您的代码应如下所示:

for elem in data:
    for val in elem.itervalues():
        for item in val['data']:

这是相当短的。

答案 1 :(得分:5)

请问,如果您希望降低数组/散列内容的任意结构,那么您可以创建一个基于type()函数执行此操作的函数。

def traverse_it(it):
    if (isinstance(it, list)):
        for item in it:
            traverse_it(item)
    elif (isinstance(it, dict)):
        for key in it.keys():
            traverse_it(it[key])
    else:
        do_something_with_real_value(it)

请注意,面向对象的普通大师会告诉你不要这样做,而是创建一个类树,其中一个基于一个数组,另一个基于一个dict,然后有一个函数来处理每个具有相同函数名的(即虚函数)并在每个类函数中调用它。 IE,if / else基于类型的树是“坏”。可以在对象上调用的函数以自己的方式处理其内容“好”。

答案 2 :(得分:1)

我认为这就是你要做的。由于xrange()遍历列表的每个,因此无需使用for从列表中提取索引。在下面的示例中,d1是对当前data[i]

的引用
for d1 in data: # iterate over outer list, d1 is a dictionary
    for x in d1: # iterate over keys in d1 (the x var is unused)
        for d2 in d1['data']: # iterate over the list

            # iterate over (key,value) pairs in inner most dict
            for k,v in d2.iteritems():
                dostuff()

您还使用名称l两次(有意或无意),但要注意作用域的工作原理。

答案 3 :(得分:0)

好吧,问题已经很久了。然而,出于我的好奇心,我想回答你的问题,以获得更好的答案。 假设,字典看起来像:dict1 = { 'a':5,'b': [1,2,{'a':100,'b':100}], 'dict 2' : {'a':3,'b':5}}

解决方案: dict1 = { 'a':5,'b': [1,2,{'a':100,'b':100}], 'dict 2' : {'a':3,'b':5}} def recurse(dict): if type(dict) == type({}): for key in dict: recurse(dict[key]) elif type(dict) == type([]): for element in dict: if type(element) == type({}): recurse(element) else: print element else: print dict recurse(dict1)