【head First python】之遞歸處理嵌套列表

【head First python】之遞歸處理嵌套列表


通常我們將數據儲存在列表中,然後使用for循環去處理。(當然,在需要額外控制的情況下可以使用while)

Demo:

movies = ["託尼",1975,"傑克",91,"唐老鴨","機器貓"]
for i in movies:
    print i

上面的for可以很正常的處理列表,但是。如果列表是多維列表還能如上正常處理嗎?

Demo:

movies = ["託尼",1975,"傑克",91,"唐老鴨",["機器貓","機器狗"]]
for i in movies:
    print i

經過測試,可以知道單純的使用for無法正確的得到我們想要的結果,不過這並不是for循環的問題,而是我們並沒有告訴for該如何處理找到的內列表,對於for循環來說,內列表只是外列表中的一個列表項而已,所以我們要讓for知道內列表也要當做列表處理!!


那麼這裏我們可以使用python內置函數isinstance(),這個函數可以檢測特定的標識符是否包含某個特定類型的數據!

Demo:

>>> the_list = ['aa','bb']
>>> isinstance(the_list,list)
True
>>> a = 'b'
>>> isinstance(a,list)
False

這個函數是不是很酷?檢測爲列表返回True否則爲False


那麼,就讓我們更新一下代碼

Demo:

movies = ["託尼",1975,"傑克",91,"唐老鴨",["機器貓","機器狗"]]
for list_wai in movies:
    if isinstance(list_wai,list):  #判斷當前循環取值是否爲列表
        for list_nei in list_wai: #上面判斷爲列表則運行該for處理這個內列表
            print(list_nei)  #打印處理好的內列表數據
    else:
        print(list_wai)    #判斷不爲列表的項則直接打印出來

上面的代碼很好的處理了內列表的數據,但是如果內列表中還有一個內列表,甚至是N個內列表,上面這段代碼可能就有點力不從心了!所以,現在該創建一個函數,使用遞歸!

Demo:

movies = ["託尼",1975,"傑克",91,"唐老鴨",["機器貓","機器狗",['我是內內列表',['我是內內內列表']]]]
def print_list(the_list): #定義一個名爲print_list的函數,帶有名爲the_list的形參
    for list_wai in the_list: #使用for處理這個形參
        if isinstance(list_wai,list): #如果當前列表項爲內列表則在下面繼續調用這個函數!
            print_list(list_wai)
        else:
            print(list_wai)#如果列表項不爲內列表,則直接打印這個列表項
                                                                                                                                                                                    
print_list(movies)#運行這個函數,並帶入通過形參帶入列表

當然,我們可以進一步將這個函數定義爲一個模塊,上傳至PyPI上與這個世界上所有的python愛好者分享!


小節:

一:isinstance()內置函數會檢查一個標識符是否制定某個指定類型的數據對象。

二:使用def來創建自己的函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章