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