电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python 列表推導式需要注意的地方

瀏覽:3日期:2022-07-07 13:09:25

原文地址:The Do’s and Don’ts of Python List Comprehension原文作者:Yong Cui, Ph.D.譯文出自:掘金翻譯計劃本文永久鏈接:github.com/xitu/gold-m…譯者:samyu2000校對者:luochen1992,shixi-li

Python 列表推導式并不是給初學者用的,因為它非常反直覺,甚至對于有其他編程語言背景的人也是如此。

我們接觸到 List 的使用時,學習的內容都是零散的。所以我們缺少一個關于如何在各種各樣的場景下使用 List 的知識體系。

本文提供了一些 List 的使用指南,盡可能涵蓋各個方面。希望本文可以成為你的一站式實用手冊。

使用建議

1.建議使用迭代的方式

使用 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]

2.如果只需用到其中的某些元素,應當使用條件判斷語句

假設你需要將符合某種條件的元素歸集起來,并創建一個 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]

3.使用條件判斷語句

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]

4.如果有嵌套結構,可以使用嵌套的循環

有可能可迭代對象中的元素自身也是可迭代的,盡管這種情況不太常見。如果你對嵌套的可迭代對象有興趣,可以使用 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]

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 的某些特性比使用高階函數更具有可讀性,而且也能實現較復雜的嵌套結構。

使用禁忌

1.不要忘了定義構造函數

有人認為列表推導式很酷炫,是 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’]

2.不要忘了生成器表達式

在 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 相比,使用 generator 內存開銷小得多,只有 96 字節。原因很簡單———— generator 不需要獲取所有的元素。相反,它只需要獲取各個元素在序列中的位置,創建下一個元素并呈現它,而且不必保存在內存中。

結論

本文中,我們整理了 list 應用的一些關鍵要領。這些該做的和不該做的都非常清晰明了。我估計你會在合適的場景中用到它。下面是本文內容的小結。

使用迭代的方式。 Python 中有許多類型的 iterable,你應當在掌握基礎(list 和 tuple)的同時融會貫通。 使用條件判斷語句。 如果你對在 iterable 中篩選某些元素感興趣,可以多多研究條件判斷。 使用條件判斷表達式。 如果你需要有選擇性地獲取某些數據,可以使用條件判斷表達式。 使用嵌套的循環。 如果你要處理嵌套的 iterable,可以使用嵌套的循環結構。 用 list 替代高階函數 在很多情況下,可以用 list 替代高階函數。 不要忘記 list 的構造函數 定義 list 的構造函數,可以使用 iterable 創建一個 list 對象。如果你直接使用 iterable,推薦用這個方法。 不要忘了生成器表達式 它的語法與 list 中的語法相似。在處理大量的對象時,這是一種節省內存開銷的辦法。list 和 generator 不同的是,為了日后的索引和訪問, list 必須提前創建,如果元素個數很多,就會消耗很大的內存。

以上就是Python 列表推導式需要注意的地方的詳細內容,更多關于Python 列表推導式的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 砍排机-锯骨机-冻肉切丁机-熟肉切片机-预制菜生产线一站式服务厂商 - 广州市祥九瑞盈机械设备有限公司 | 无锡装修装潢公司,口碑好的装饰装修公司-无锡索美装饰设计工程有限公司 | 北京工业设计公司-产品外观设计-产品设计公司-千策良品工业设计 北京翻译公司-专业合同翻译-医学标书翻译收费标准-慕迪灵 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 变色龙PPT-国内原创PPT模板交易平台 - PPT贰零 - 西安聚讯网络科技有限公司 | 卫生人才网-中国专业的医疗卫生医学人才网招聘网站! | 济南律师,济南法律咨询,山东法律顾问-山东沃德律师事务所 | 苗木价格-苗木批发-沭阳苗木基地-沭阳花木-长之鸿园林苗木场 | 苏州伊诺尔拆除公司_专业酒店厂房拆除_商场学校拆除_办公楼房屋拆除_家工装拆除拆旧 | 国标白水泥,高标号白水泥,白水泥厂家-淄博华雪建材有限公司 | 大型低温冷却液循环泵-低温水槽冷阱「厂家品牌」京华仪器_京华仪器 | 运动木地板价格,篮球馆体育运动木地板生产厂家_欧氏地板 | 标准品网_标准品信息网_【中检计量】 | 新型游乐设备,360大摆锤游乐设备「诚信厂家」-山东方鑫游乐设备 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 江西自考网-江西自学考试网| 分子精馏/精馏设备生产厂家-分子蒸馏工艺实验-新诺舜尧(天津)化工设备有限公司 | 上海恒驭仪器有限公司-实验室平板硫化机-小型平板硫化机-全自动平板硫化机 | HV全空气系统_杭州暖通公司—杭州斯培尔冷暖设备有限公司 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 派克防爆伺服电机品牌|国产防爆伺服电机|高低温伺服电机|杭州摩森机电科技有限公司 | 自动部分收集器,进口无油隔膜真空泵,SPME固相微萃取头-上海楚定分析仪器有限公司 | 太原装修公司_山西整装家装设计_太原室内装潢软装_肖邦家居 | 众能联合-提供高空车_升降机_吊车_挖机等一站工程设备租赁 | 布袋除尘器|除尘器设备|除尘布袋|除尘设备_诺和环保设备 | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 电竞馆加盟,沈阳网吧加盟费用选择嘉棋电竞_售后服务一体化 | 温控器生产厂家-提供温度开关/热保护器定制与批发-惠州市华恺威电子科技有限公司 | 深圳工程师职称评定条件及流程_深圳职称评审_职称评审-职称网 | 储气罐,真空罐,缓冲罐,隔膜气压罐厂家批发价格,空压机储气罐规格型号-上海申容压力容器集团有限公司 | 电动不锈钢套筒阀-球面偏置气动钟阀-三通换向阀止回阀-永嘉鸿宇阀门有限公司 | 合肥宠物店装修_合肥宠物美容院装修_合肥宠物医院设计装修公司-安徽盛世和居装饰 | 玉米深加工机械,玉米加工设备,玉米加工机械等玉米深加工设备制造商-河南成立粮油机械有限公司 | 节流截止放空阀-不锈钢阀门-气动|电动截止阀-鸿华阀门有限公司 | 双齿辊破碎机-大型狼牙破碎机视频-对辊破碎机价格/型号图片-金联机械设备生产厂家 | 旋转/数显粘度计-运动粘度测定仪-上海平轩科学仪器 | 流量卡中心-流量卡套餐查询系统_移动电信联通流量卡套餐大全 | 地脚螺栓_材质_标准-永年县德联地脚螺栓厂家 | 防爆电机生产厂家,YBK3电动机,YBX3系列防爆电机,YBX4节防爆电机--河南省南洋防爆电机有限公司 | 优秀的临床医学知识库,临床知识库,医疗知识库,满足电子病历四级要求,免费试用 | 酒精检测棒,数显温湿度计,酒安酒精测试仪,酒精检测仪,呼气式酒精检测仪-郑州欧诺仪器有限公司 |