[英]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.