【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來創建自己的函數