亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python 遞歸與嵌套列表

Python 遞歸與嵌套列表

茅侃侃 2023-09-12 15:07:27
我正在嘗試創建一個遞歸函數,該函數遍歷具有單個字符串的任何級別的嵌套列表,并返回 True 或 False 無論給定字符是否在該列表中。這是我的代碼:def inlist(character, lists):    """Checks if a given character is in a list of any level"""        if lists[0] == character:        return True        elif isinstance(lists[0], list):        return inlist(character,lists[0])        elif not lists[0] == character:        return inlist(character,lists[1:])        else:        return False當我運行代碼時: ("c", [["a", "b","c", "d"],"e"])它似乎工作正常。但是,當我以這種方式輸入列表時: ("c", [["a", "b",],["c", "d"],"e"])它給了我一個錯誤,它說:IndexError:列表索引超出范圍我可以不這樣寫嵌套列表嗎?如果是這樣,為什么?或者我的代碼有什么問題導致它無法遍歷整個列表?
查看完整描述

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

這對于某些問題可能很有用,但要在列表中查找元素,循環會更快。此外,對于較長的列表,最大遞歸深度將是一個問題。


查看完整回答
反對 回復 2023-09-12
?
紅糖糍粑

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


查看完整回答
反對 回復 2023-09-12
?
慕沐林林

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驗證當前級別中的所有項目后將執行附加操作


如果完成所有項目但未找到 - 完成


當該項目有更多機會出現在外部列表中時效果更好


查看完整回答
反對 回復 2023-09-12
  • 3 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號