Python3中的「加和」函數

2023-02-14 12:01:15

技術背景

其實如果沒有專門去研究python的一些內建函數的話,我們都沒辦法發現一些很神奇的功能,即使是我們最熟悉的python中的sum函數。不知道還有多少人,以為這只是一個只能用來做求和的函數?

對列表求和

In [1]: my_list = [1,2,3,4,5]

In [2]: sum(my_list)
Out[2]: 15

當然,這也是sum函數的基本功能,類似於sum函數的還有min求最小值函數和max求最大值函數等:

In [3]: min(my_list)
Out[3]: 1

In [4]: max(my_list)
Out[4]: 5

當然,其實sum函數也不僅僅是可以對list這種資料結構進行求和,對tuple中的所有元素進行求和,也是可以的。

In [6]: my_tuple
Out[6]: (1, 2, 3, 4, 5)

In [7]: sum(my_tuple)
Out[7]: 15

如果對一個字典使用sum函數,求得的結果是字典中所有鍵值的和:

In [8]: my_dict = {1:2,2:4,3:6,4:8,5:10}

In [9]: sum(my_dict)
Out[9]: 15

對異形列表進行展開

接下來是本文的重點,如果我們要對如下這樣的一個異形list進行展開,我們會使用什麼樣的辦法呢?

In [14]: my_list = [[1],[2,3],[4,5,6]]

一般我們會想到採用一個for迴圈來解決該問題:

In [28]: my_list_for = []

In [29]: for l in my_list:
    ...:     my_list_for.extend(l)
    ...:

In [30]: my_list_for
Out[30]: [1, 2, 3, 4, 5, 6]

但是其實同樣的操作,我們可以使用python內建的sum函數對該問題進行求解,這樣在形式上就簡便了很多:

In [31]: sum(my_list,[])
Out[31]: [1, 2, 3, 4, 5, 6]

非常簡單,只需要一行程式碼,就可以實現對一個list進行展開的操作。當然,這個方法對於二維的list是可以正常使用的,可對於更加高維的巢狀異形list,使用sum函數,是得不到我們想要的效果的:

In [35]: my_list = [[1],[2,3],[4,5,[6]]]

In [36]: sum(my_list,[])
Out[36]: [1, 2, 3, 4, 5, [6]]

如果是規則的list,可以多用幾次sum函數即可解決,如果是異形的list,在執行的過程中很有可能報錯。

In [39]: my_list = [[[1]],[[2],[3]],[[4],[5],[6]]]

In [40]: sum(my_list,[])
Out[40]: [[1], [2], [3], [4], [5], [6]]

In [41]: sum(sum(my_list,[]),[])
Out[41]: [1, 2, 3, 4, 5, 6]

其實相比於for迴圈,或者是高緯度下的while迴圈,這個方法只是在使用上簡便一些,但是之前確實沒有發現內建的sum函數還有這樣的功能。

總結概要

如果我們遇到[[1],[2,3],[4,5,6]]這樣的一個python列表,想把他展平為一個一維的列表,這個時候你會使用什麼樣的方法呢?for迴圈?while迴圈?其實python的內建函數sum中簡單的支援了一下這樣的功能,使得我們可以更加簡便的把一個高維且長度不固定的列表展平為一個規則的一維列表。

版權宣告

本文首發連結為:https://www.cnblogs.com/dechinphy/p/sum-builtin.html

作者ID:DechinPhy

更多原著文章請參考:https://www.cnblogs.com/dechinphy/

打賞專用連結:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

騰訊雲專欄同步:https://cloud.tencent.com/developer/column/91958

CSDN同步連結:https://blog.csdn.net/baidu_37157624?spm=1008.2028.3001.5343

51CTO同步連結:https://blog.51cto.com/u_15561675