您好,登錄后才能下訂單哦!
小編給大家分享一下Python使用列表推導式需要注意什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
Python教程欄目今天翻譯介紹列表推導式使用的注意事項。
Python 列表推導式并不是給初學者用的,因為它非常反直覺,甚至對于有其他編程語言背景的人也是如此。
我們接觸到 List 的使用時,學習的內容都是零散的。所以我們缺少一個關于如何在各種各樣的場景下使用 List 的知識體系。
使用 List 最基本的方式是以一個可迭代對象為基礎,創建一個 List 對象,這個可迭代對象可以是任意可以迭代元素的Python對象。使用方法如下。
[expression for item in iterable]復制代碼
下面這段代碼展示了一個使用列表相關技術創建 List 對象的例子。在這個例子中,我們定義了一個 Integer 列表,并基于這個對象創建了保存每個數字的平方數和立方數的 List 對象。
>>> # 創建一個 Integer 列表>>> integers = [1, 2, 3, 4, 5, 6]>>> # 創建平方數和立方數列表>>> powers = [(x*x, pow(x, 3)) for x in integers]>>> print(powers) [(1, 1), (4, 8), (9, 27), (16, 64), (25, 125), (36, 216)]復制代碼
上面的例子把 List 對象當作迭代器使用。我們應該知道,許多類型的對象也是可迭代的,比如 List、Set、Dictionary 和 String 等等。其他數據類型,像 range、map、filter,以及 pandas 包中的 Series、DataFrame,都是可迭代的。下面的代碼演示了某些對象的使用方法。
>>> # 使用 range 對象>>> integer_range = range(5)>>> [x*x for x in integer_range] [0, 1, 4, 9, 16]>>> # 使用 Series 對象 >>> import pandas as pd>>> pd_series = pd.Series(range(5))>>> print(pd_series)0 01 12 23 34 4dtype: int64>>> [x*x for x in pd_series] [0, 1, 4, 9, 16]復制代碼
假設你需要將符合某種條件的元素歸集起來,并創建一個 list。下面展示了相關的語法。
[expression for item in iterable if condition]復制代碼
if
語句用來實現條件判斷。下面的代碼展示了這種用法的一個簡單示例。
>>> # 同樣創建一個 Integer 列表>>> integers = [1, 2, 3, 4, 5, 6]>>> # 篩選出偶數,創建一個這些偶數的平方數列表>>> squares_of_evens = [x*x for x in integers if x % 2 == 0]>>> print((squares_of_evens)) [4, 16, 36]復制代碼
List 對象中還可以使用 if-else 形式的條件判斷,語法如下。
[expression0 if condition else expression1 for item in iterable]復制代碼
這跟前面的那種用法有些類似,別把這兩種用法混淆。在本例中,條件語句本身是一個整體。下面的代碼提供了一個例子。
>>> # 創建一個 Integer 列表>>> integers = [1, 2, 3, 4, 5, 6]>>> # 遍歷 integers 中的元素,如果是偶數,取平方數存入新的列表>>> # 如果是奇數,取立方數存入新的列表>>> custom_powers = [x*x if x % 2 == 0 else pow(x, 3) for x in integers]>>> print(custom_powers) [1, 4, 27, 16, 125, 36]復制代碼
有可能可迭代對象中的元素自身也是可迭代的,盡管這種情況不太常見。如果你對嵌套的可迭代對象有興趣,可以使用 for
來實現循環嵌套。語法如下。
[expression for item_outer in iterable for item_inner in item_outer] # 與下面的代碼等同 for item_outer in iterable: for item_inner in item_outer: expression復制代碼
上面的代碼展示了使用for
實現嵌套循環的例子。
>>> # 創建一個包含元組的列表>>> prices = [('$5.99', '$4.99'), ('$3.5', '$4.5')]>>> # 獲取元組中的每個價格,以此創建一個一維列表>>> prices_formatted = [float(x[1:]) for price_group in prices for x in price_group]>>> print(prices_formatted) [5.99, 4.99, 3.5, 4.5]復制代碼
有的人比較習慣函數式編程,比如使用高階函數也是這種習慣的表現之一。特別說明一下,高階函數是那些需要使用輸入或輸出參數的函數。在 Python 中,常用的高階函數有 map()
和 filter()
。
>>> # 創建一個 integer 類型的列表>>> integers = [1, 2, 3, 4, 5]>>> # 使用 map 創建平方數列表>>> squares_mapped = list(map(lambda x: x*x, integers))>>> squares_mapped [1, 4, 9, 16, 25]>>> # 使用列表推導式創建平方數列表>>> squares_listcomp = [x*x for x in integers]>>> squares_listcomp [1, 4, 9, 16, 25]>>> # 使用 filter 取得 integers 中的偶數列表>>> filtered_filter = list(filter(lambda x: x % 2 == 0, integers))>>> filtered_filter [2, 4]>>> # 使用列表推導式取得 integers 中的偶數列表>>> filterd_listcomp = [x for x in integers if x % 2 == 0]>>> filterd_listcomp [2, 4]復制代碼
從上面的例子可以看出,使用 list 的某些特性比使用高階函數更具有可讀性,而且也能實現較復雜的嵌套結構。
有人認為列表推導式很酷炫,是 Python 特有的功能,所以為了炫耀自己的 Python 水平,即使有更好替代方案也要使用它。
>>> # 使用 range 創建列表對象>>> numbers = [x for x in range(5)]>>> print(numbers) [0, 1, 2, 3, 4]>>> # 以一個字符串為基礎,創建一個小寫字母的字符列表>>> letters = [x.lower() for x in 'Smith']>>> print(letters) ['s', 'm', 'i', 't', 'h']復制代碼
上述例子中,我們使用了 range 和 string,這兩種數據結構都是可迭代的,list()
構造函數可以直接使用 iterable 創建一個 list 對象。下面的代碼提供了更合理的解決方案。
>>> # 使用 range 創建列表對象>>> numbers = list(range(5))>>> print(numbers) [0, 1, 2, 3, 4]>>> # 以一個字符串為基礎,創建一個小寫字母的字符列表>>> letters = list('Smith'.lower())>>> print(letters) ['s', 'm', 'i', 't', 'h']復制代碼
在 Python 中,生成器是一種特殊的可迭代對象,它會延遲加載元素,直到被請求才會加載。這在處理大量數據時會非常高效,它能提升存儲效率。相比之下,list 對象為了方便計數和索引,一次性創建所有的元素。所以跟生成器相比,在元素個數相同時,list 需要占用更多內存。
我們可以定義一個生成器函數來創建生成器。我們也可以使用下面的語句來創建生成器,這是一種稱為生成器表達式的方法。
(expression for item in iterable)復制代碼
你可能會注意到,除了使用圓括號外,它的語法跟使用 list 的語句很相似。所以需要注意區分。
考慮下面這個例子。我們要計算前一百萬個數字的平方和。如果使用 list 來實現,方法如下。
>>> # 創建列表對象 squares >>> squares = [x*x for x in range(10_000_000)]>>> # 計算它們的總和>>> sum(squares)333333283333335000000>>> squares.__sizeof__()81528032復制代碼
如上所示,list 對象占據 81528032 字節。我們考慮使用 generator 進行相同的操作,代碼如下。
>>> # 創建 generator 對象,保存每個數的平方數>>> squares_gen = (x*x for x in range(10_000_000))>>> # 計算它們的總和>>> sum(squares_gen)333333283333335000000>>> squares_gen.__sizeof__()96復制代碼
跟使用 list 相比,使用 generator 內存開銷小得多,只有 96 字節。原因很簡單———— generator 不需要獲取所有的元素。相反,它只需要獲取各個元素在序列中的位置,創建下一個元素并呈現它,而且不必保存在內存中。
本文中,我們整理了 list 應用的一些關鍵要領。這些該做的和不該做的都非常清晰明了。我估計你會在合適的場景中用到它。下面是本文內容的小結。
看完了這篇文章,相信你對Python使用列表推導式需要注意什么有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。