3 回答

TA貢獻1757條經驗 獲得超8個贊
采用純遞歸方法,就像問題中使用的那樣:
def inlist(char, lists):
if not lists: # check for empty list
return False
if lists[0] == char:
return True
elif isinstance(lists[0], list) and inlist(char, lists[0]):
return True # return only if found in sublist, otherwise continue
elif len(lists) > 1: # check rest of the list, if there is a rest
return inlist(char, lists[1:])
return False # all possibilities exhausted. Char not in this (sub-)list
這對于某些問題可能很有用,但要在列表中查找元素,循環會更快。此外,對于較長的列表,最大遞歸深度將是一個問題。

TA貢獻1815條經驗 獲得超6個贊
在這種isinstance(lists[0], list)情況下,您仍然必須小心檢查lists[1]遞歸調用是否返回 false。
在獲取值之前始終檢查列表是否為空。這是使用高階函數(例如 )來思考問題的另一種方法some。
def some(f, t):
if not t:
return False
else:
return f(t[0]) or some(f, t[1:])
def inlist(char, ls):
return some \
( lambda v: inlist(char, v) if isinstance(v, list) else char == v
, ls
)
input = ["c", [["a", "b",],["c", "d"],"e"]]
print(inlist("a", input))
print(inlist("z", input))
True
False
上面我們寫some的作為練習。你應該知道 Python 有一個內置any函數 -
def inlist(char, ls):
return any(isinstance(v, list) and inlist(char, v) or char == v for v in ls)
input = ["c", [["a", "b",],["c", "d"],"e"]]
print(inlist("a", input))
print(inlist("z", input))
True
False

TA貢獻2016條經驗 獲得超9個贊
你把它弄得有點復雜,而遞歸時的思維方式應該簡單得多
DFS-ish 版本:
(你可以在網上閱讀更多關于DFS遍歷的內容)
def inlist(character, lists):
"""Checks if a given character is in a list of any level"""
for item in lists:
if item==character:
return True
if isinstance(item, list):
if inlist(character, item):
return True
return False
a = ["c", [["a", "b",],["c", "d"],"e"]]
print(inlist("a", a))
輸出:
True
對于此輸入:
print(inlist("z", a))
輸出是:
False
簡短說明:
循環遍歷列表中的所有項目
如果該項目是角色 - 完成
如果該項目是列表 - 立即調用遞歸(這里吸引人的部分是僅在 True 時返回,因為如果不是 - 這并不意味著在其他項目中找不到該字符)
如果完成所有項目但未找到 - 完成
當該項目有更多機會出現在內部列表中時效果更好
BFS 版本:
(你可以在網上閱讀更多關于BFS遍歷的內容)
def inlist(character, lists):
"""Checks if a given character is in a list of any level"""
extra_arr = []
for item in lists:
if item==character:
return True
if isinstance(item, list):
extra_arr.append(item)
for extra_item in extra_arr:
if inlist(character, extra_item):
return True
return False
當然,結果是一樣的。
簡短說明:
循環遍歷列表中的所有項目
如果該項目是角色 - 完成
如果該項目是列表 -extra_arr驗證當前級別中的所有項目后將執行附加操作
如果完成所有項目但未找到 - 完成
當該項目有更多機會出現在外部列表中時效果更好
添加回答
舉報