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