第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

Python 遞歸與嵌套列表

Python 遞歸與嵌套列表

茅侃侃 2023-09-12 15:07:27
我正在嘗試創(chuàng)建一個遞歸函數(shù),該函數(shù)遍歷具有單個字符串的任何級別的嵌套列表,并返回 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條經(jīng)驗 獲得超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

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


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

TA貢獻1815條經(jīng)驗 獲得超6個贊

在這種isinstance(lists[0], list)情況下,您仍然必須小心檢查lists[1]遞歸調(diào)用是否返回 false。


在獲取值之前始終檢查列表是否為空。這是使用高階函數(shù)(例如 )來思考問題的另一種方法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 有一個內(nèi)置any函數(shù) -


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條經(jīng)驗 獲得超9個贊

你把它弄得有點復雜,而遞歸時的思維方式應該簡單得多


DFS-ish 版本:


(你可以在網(wǎng)上閱讀更多關(guān)于DFS遍歷的內(nèi)容)


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

簡短說明:


循環(huán)遍歷列表中的所有項目


如果該項目是角色 - 完成


如果該項目是列表 - 立即調(diào)用遞歸(這里吸引人的部分是僅在 True 時返回,因為如果不是 - 這并不意味著在其他項目中找不到該字符)


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


當該項目有更多機會出現(xiàn)在內(nèi)部列表中時效果更好


BFS 版本:


(你可以在網(wǎng)上閱讀更多關(guān)于BFS遍歷的內(nèi)容)


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

當然,結(jié)果是一樣的。


簡短說明:


循環(huán)遍歷列表中的所有項目


如果該項目是角色 - 完成


如果該項目是列表 -extra_arr驗證當前級別中的所有項目后將執(zhí)行附加操作


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


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


查看完整回答
反對 回復 2023-09-12
  • 3 回答
  • 0 關(guān)注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號