簡體   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