演算法題 不定列表求和

2021-09-29 22:34:48 字數 2044 閱讀 1412

在乙個巢狀了多個元素為數字或列表 (列表中也是數字或列表) 的列表中,求出所有數字的和。

例如: [1, [2, [3, [4, 5]]]] 的和為 15,[1, 2, 3, 4, 5] 的和也為 15。

通過遍歷每乙個元素,如果發現這個元素不是列表,就把它累加,否則繼續遍歷這個元素直到找到數字。可以採用遞迴的方式來求解。

def

sum_ulist

(exp)

:sum=0

for i in exp:

sum+= i if

type

(i)!=

list

else sum_ulist(i)

return

sum

可以看到最後的程式非常短小,執行如下:

>>

> sum_ulist([1

,[2,

[3,[

4,5]

]]])

15>>

> sum_ulist([1

,2,3

,4,5

])15

還是乙個不定巢狀層數的列表,這次不進行求和,而是把其中的所有數字都取出來,最後放在乙個列表中返回。

與上面類似,不過上面的求和在每一次函式呼叫中只關注當前層級的總和即可,而這邊的遞迴需要把數字都放在同乙個列表中,可以利用預設引數的乙個特性來解決。

我們之前提到,預設引數必須設定為不可變,否則會帶來一些問題:當你呼叫此函式卻不指定預設引數的值時,它會自動使用函式第一次呼叫中預設引數的物件,如果這個物件發生了改變,可能達不到我們預期的效果。

舉個例子:

def

a(li=

):1)

return li

>>

> a()[

1]>>

> a()[

1,1]

>>

> a()[

1,1,

1]

這種情況在很多時候都不是我們想要的,這邊卻可以利用這個特性:

def

add_ulist

(exp, tem_li=

):for i in exp:

iftype

(i)!=

list

else add_ulist(i)

return

sum

通過在 else 語句後面的遞迴中不指定預設引數,我們就讓後面的函式呼叫都只操作第一次函式呼叫時初始化的 tem_li 物件了,少寫了幾個字母 ?

執行如下:

>>

> add_ulist([1

,[2,

[3,[

4,5]

]],[

6,[7

,8]]

])[1

,2,3

,4,5

,6,7

,8]

當然,在 else 語句後面的遞迴中將這次函式獲得的 tem_li 列表傳給預設引數也可以:

def

add_ulist

(exp, tem_li=

):for i in exp:

iftype

(i)!=

list

else add_ulist(i, tem_li)

return

sum

最後,如果弄不清楚預設引數的奇妙性質的話,還是老老實實將預設引數設定為不可變物件吧:

def

add_ulist

(exp, tem_li=

none):

if tem_li is

none

: tem_li =

for i in exp:

iftype

(i)!=

list

else add_ulist(i, tem_li)

return

sum

演算法題 不定列表求和

可以看到最後的程式非常短小,執行如下 sum ulist 1,2,3,4,5 15sum ulist 1,2,3,4,5 15思考 還是乙個不定巢狀層數的列表,這次不進行求和,而是把其中的所有數字都取出來,最後放在乙個列表中返回。與上面類似,不過上面的求和在每一次函式呼叫中只關注當前層級的總和即可,...

python函式不定引數求和

想最快的入門python嗎?請搜尋 泉小朵 來學習python最快入門教程。也可以加入我們的python學習q群 902936549,送給每一位python的小夥伴教程資料。先來看python函式定引數求和 def dup1 m n l total 0 total m n l return tota...

排序演算法(不定時更新 )

插入排序 插入排序 初始時,拿第二個和第乙個比較,如果第二個小於第乙個,兩個交換 當進行到第n次時,前面的n 1個順序應該是正確的 拿第n個和前面的n 1個數比較,如果第m個小於n,m 1大於n,則把n插到m和m 1中間 相當於將n和前乙個數比較,如果前乙個數大於n,則把前乙個移動到n的位置上,內層...