繁体   English   中英

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

[英]Python: How to traverse a List[Dict{List[Dict{}]}]

我只是想知道是否有一种简单的方法可以做到这一点。 我有一个从文件解析的特定结构,输出是一个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大约一个月左右,所以我决不是专家,甚至不是语言的中间用户。 提前谢谢你的答案。

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

永远不需要遍历xrange(len(data)) 您可以遍历data (对于列表)或data.items() (或values() )(对于dict)。

您的代码应如下所示:

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

这是相当短的。

请问,如果你想要降低数组/散列东西的任意结构,那么你可以创建一个函数来基于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基于类型的树是“坏”。 可以在对象上调用的函数以自己的方式处理其内容“好”。

我想这就是你要做的。 有没有必要使用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两次(有意或无意),但要注意范围的工作原理。

好吧,问题很老了。 然而,出于我的好奇心,我想回答你的问题,以获得更好的答案。 假设,字典看起来像: 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM