3

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

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

4 回答 4

10

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

您的代码应如下所示:

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

这要短得多。

于 2013-06-06T17:04:35.653 回答
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 树是“坏的”。可以在对象上调用的函数以“好”的方式处理其内容。

于 2013-06-06T17:09:37.727 回答
1

我认为这就是你想要做的。由于迭代列表的每个,因此无需使用xrange()从列表中提取索引。因此,在我下面的示例中是对当前.ford1data[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两次名称(有意或无意),但要注意范围界定的工作方式。

于 2013-06-06T17:09:06.003 回答
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)

于 2015-08-28T09:21:48.367 回答