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