簡體   English   中英

Python 3獲取當前列表循環的深度

[英]Python 3 get depth of current list loop

因此,基本上,我需要遍歷未知深度的嵌套列表,並獲取路徑以及變量。 我可以遍歷列表並獲得正確的變量,但是我不知道如何獲取路徑,因為所有循環中只有一個for循環。 如果我能得到代碼當前正在遍歷的深度,那么我可以告訴程序應該更改路徑(保存列表)的哪一部分。

如果還有另一種方法可以遍歷任意嵌套的列表並獲取路徑以及變量,則可以隨意提及。 如果發生這種情況,那么我將嘗試更改問題的名稱。

另請注意,我無法搜索列表中的項目,因為可能存在重復項,並且我想訪問列表中的所有信息。 還增加了一個復雜性,即需要輕松調整解決方案以與嵌套在一起的字典和列表一起使用。

這是我的代碼...(我以這種方式調用函數最終將導致它崩潰,但我現在不關心它。)

global savelist
savelist=[]

def for1(var):
    global savelist
    for f in range(len(var)):
        if isinstance(var[f], list):
            savelist.append(f)
            loop(var[f])
        if isinstance(var[f], str):
            savelist.append(f)
            savelist.append(var[f])
            print(savelist)
            savelist.pop()
            savelist.pop()

def loop(var):
    for1(var)

def main():
    loop(foods)

main()

應該拿這個清單

foods=["avacado"
       , ["lemon", "orange", "lime"]
       , [["crabapple", "apple"], ["wild pear", "pear"]] 
       , [["ham", "bacon"], ["steak", "brisket"], ["tilapia", "cod"]]
]

並輸出

[0, 'avacado']
[1, 0, 'lemon']
[1, 1, 'orange']
[1, 2, 'lime']
[2, 0, 0, 'crabapple']
[2, 0, 1, 'apple']
[2, 1, 0, 'wild pear']
[2, 1, 1, 'pear']
[3, 0, 0, 'ham']
[3, 0, 1, 'bacon']
[3, 1, 0, 'steak']
[3, 1, 1, 'brisket']
[3, 2, 0, 'tilapia']
[3, 2, 1, 'cod']

但相反,它輸出此

[0, 'avacado']
[1, 0, 'lemon']
[1, 1, 'orange']
[1, 2, 'lime']
[1, 2, 0, 0, 'crabapple']
[1, 2, 0, 1, 'apple']
[1, 2, 0, 1, 0, 'wild pear']
[1, 2, 0, 1, 1, 'pear']
[1, 2, 0, 1, 3, 0, 0, 'ham']
[1, 2, 0, 1, 3, 0, 1, 'bacon']
[1, 2, 0, 1, 3, 0, 1, 0, 'steak']
[1, 2, 0, 1, 3, 0, 1, 1, 'brisket']
[1, 2, 0, 1, 3, 0, 1, 2, 0, 'tilapia']
[1, 2, 0, 1, 3, 0, 1, 2, 1, 'cod']

如果我能說出我在for循環中的深度,那么我可以編輯正確的保存列表編號。 因為我缺少該信息,所以找不到解決此問題的簡單方法。

試着用語言表達自己在做什么。 在我看來,您想要每個字符串的索引列表。 因此,將列表和當前索引傳遞給遞歸函數。

foods=["avacado"
       , ["lemon", "orange", "lime"]
       , [["crabapple", "apple"], ["wild pear", "pear"]]
       , [["ham", "bacon"], ["steak", "brisket"], ["tilapia", "cod"]]
]

def homework(lst, indices):
  ret = []
  if isinstance(lst, str):
    ret.append( indices + [lst] )
    return ret
  for i, x in enumerate(lst):
    ret.extend( homework(x, indices + [i]) )
  return ret

print ( homework(foods,[]) )

對於這種遞歸,生成器通常運行良好:

def dump(levels, foods):
    for i, food in enumerate(foods):
        if isinstance(food, list):
            yield from dump(levels + [i], food)
        else:
            yield levels + [i, food]

測試代碼:

foods = [
    "avacado",
    ["lemon", "orange", "lime"],
    [
        ["crabapple", "apple"], ["wild pear", "pear"]
    ], [
        ["ham", "bacon"], ["steak", "brisket"], ["tilapia", "cod"]
    ]
]

for i in dump([], foods):
    print(i)

結果:

[0, 'avacado']
[1, 0, 'lemon']
[1, 1, 'orange']
[1, 2, 'lime']
[2, 0, 0, 'crabapple']
[2, 0, 1, 'apple']
[2, 1, 0, 'wild pear']
[2, 1, 1, 'pear']
[3, 0, 0, 'ham']
[3, 0, 1, 'bacon']
[3, 1, 0, 'steak']
[3, 1, 1, 'brisket']
[3, 2, 0, 'tilapia']
[3, 2, 1, 'cod']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM