日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python之列表表达式及高阶函数lamda、zip、enumerate、map和filter方法

發布時間:2024/5/21 python 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python之列表表达式及高阶函数lamda、zip、enumerate、map和filter方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、列表表達式[List Comprehension]

  • 顧名思義,這個表達式作用是以一個快捷的方法對列表進行操作或運算,返回新的列表。其使用方式為[表達式 for 變量 in 列表] 或者 [表達式 for 變量 in 列表 if 條件]。
  • 一個最簡單的列表表達式,如下所示:
>>> list1 = [1, 2, 3, 4] >>> list2 = [i*i for i in list1] >>> list3 = [i*i for i in list1 if i>2] >>> print(list2) [1, 4, 9, 16] >>> print(list3) [9, 16]
  • 列表表達式也可以遍歷元組生成新的列表(如 list5),然而卻不能直接生成新的元組。比如 list6 實際上是個生成器表達式,不屬于列表表達式了。對于生成器表達式可以通過使用 list6.next() 方法一次一次取值。
>>> tuple1 = (1, 2, 3, 4) >>> list5 = [i*i for i in tuple1] >>> print(list5) [1, 4, 9, 16] >>> list6 = (i*i for i in tuple1) >>> print(list6) <generator object <genexpr> at 0x03559E10>
  • 統計字符串列表中每個字符串的長度:
>>> words = ['abc','defg','I love python', 'Django'] >>> len_list = [ len(word) for word in words ] >>> print(len_list) [3, 4, 13, 6]
  • 利于列表表達式求兩個列表的交集:
>>> a = [ 3, 5, 6, 8] >>> b = [ 5, 6] >>> a_b = [ i for i in a if i in b] >>> print(a_b) [5, 6]
  • 打印出 100 以內所有十位數比個位數大 1 位的數字:
>>> num = [ n1*10+n2 for n1 in range(0, 10) for n2 in range(0, 10) if n1 == n2+1 ] >>> print(num) [10, 21, 32, 43, 54, 65, 76, 87, 98]

二、匿名函數 lambda 函數

  • Lambda 函數又稱匿名函數,也有人稱為 lambda 表達式。顧名思義,匿名函數就是沒有名字的函數。函數沒有名字也行嗎?當然可以啦。有些函數如果只是臨時一用,而且它的業務邏輯也很簡單時,就沒必要非給它取個名字不可。
  • lambda 匿名函數的格式是 lambda 參數: 表達式,冒號前是參數,可以有多個,用逗號隔開,冒號右邊的為表達式。其實 lambda 返回值是一個函數的地址,也就是函數對象。
  • 如下所示,是一個最簡單的 lambda 函數:
>>> add = lambda x, y: x+y >>> type(add) <class 'function'> >>> print(add(3,5)) 8
  • 既然是匿名函數,為什么還要給它取個叫 add 的名字?這的確是多次一舉。其實 lambda 最常用的還是和 sorted, map、reduce、filter 這些高級函數結合使用。
  • 再來看兩個使用 lambda 函數結合 sorted 方法排序的經典例子:一個按絕對值大小排序,一個按字符串長度排序:
>>> list1 = [ 5, -3, 1, 8, -4 ] >>> list2 = sorted(list1, key=lambda x:abs(x)) >>> print(list2) [1, -3, -4, 5, 8]>>> list3 = ['to', 'python', 'ABC'] >>> list4 = sorted(list3, key=lambda x:len(x)) >>> print(list4) ['to', 'ABC', 'python']
  • 如下所示,是一道關于 lambda 函數的經典面試題,flist[0] 結果輸出什么呢?
>>> flist = [ lambda x:x*x for x in range(1, 3)] >>> print(flist) [<function <listcomp>.<lambda> at 0x03ADE2B8>, <function <listcomp>.<lambda> at 0x03ADE300>] >>> flist[0] <function <listcomp>.<lambda> at 0x03ADE2B8> >>> flist[0](2) 4
  • 這個主要考函數對象列表,千萬不要和列表表達式搞混了,答案是 flist[0] 輸出的是函數對象。

三、zip 函數

  • zip() 函數來可以把 2 個或多個列表合并,并創建一個元組對的列表,元組對的數量以合并列表的最短長度為準
  • python 3中 zip 方法合并列表后生成的是 zip 對象,使用 list 方法可以將其變成列表,使用 dict 方法可以將其變成字典:
>>> l1 = [ 1, 2, 3 ] >>> l2 = [ 'x', 'y', 'z'] >>> l3 = [ 'x', 'y' ] >>> zip(l1, l2) <zip object at 0x031D6828> >>> print(list(zip(l1, l2))) [(1, 'x'), (2, 'y'), (3, 'z')] >>> print(list(zip(l1, l3))) [(1, 'x'), (2, 'y')] >>> print(dict(zip(l1,l3))) {1: 'x', 2: 'y'}
  • 實際上 zip 方法支持所有可迭代對象(字符串、列表、元祖、字典),而不僅僅是列表。利用這個特性,可以很容易創建各種字典,包括很復雜的字典。
  • 來看 2 個經典例子,如下所示,注意 zip 對象支持直接遍歷,不需要先轉成 list 或 dict:
>> > l1 = [1, 2, 3] >> > str1 = "abc" >> > print(dict(zip(l1, str1))) {1: 'a', 2: 'b', 3: 'c'} >> > name = ["John", "Jim", "Lucy"] >> > year = [1983, 1985, 1995] >> > birth_year = dict(zip(name, year)) >> > print(birth_year) {'John': 1983, 'Jim': 1985, 'Lucy': 1995} >> > for name, year in zip(name, year):print("{} - {}".format(name, year))John - 1983 Jim - 1985 Lucy - 1995
  • 利用 zip(*some_list) 方法可以實現元組列表的反向解壓,如下所示:
>>> l1 = [("John", 1995), ("Lucy", 2000), ("Max", 1985)] >>> name, year = zip(*l1) >>> print(name) ('John', 'Lucy', 'Max') >>> print(year) (1995, 2000, 1985) >>> l2 = dict(l1) >>> print(l2) {'John': 1995, 'Lucy': 2000, 'Max': 1985} >>> name1, year1 = zip(*l2) Traceback (most recent call last):File "<pyshell#6>", line 1, in <module>name1, year1 = zip(*l2) ValueError: too many values to unpack (expected 2)
  • 注意 unzip 只支持元組列表,不支持 dict 直接解壓。

四、enumerate() 函數

  • enumerate() 函數用于將一個可遍歷的數據對象(如列表、元組或字符串)組合為一個索引序列,同時列出數據和數據下標,常見用于 for 循環。一般只有需要同時用到索引 index 和 value 值的時候才用 enumerate 方法。
  • 直接使用 enumerate 方法生成是個 enumerate 對象,可以遍歷。
>> > name = ["John", "Lucy", "Mary"] >> > name1 = enumerate(name) >> > print(name1) < enumerate object at 0x030D0FA8 > >> > for index, name in enumerate(name):print("{}-{}".format(index, name))0 - John 1 - Lucy 2 - Mary

五、map 函數

  • map 函數是個非常有用的方法,其語法是 map(function, iterable, …)。map 方法可以接收函數作為參數,并將其映射于列表的多個元素。
  • Python 2 中返回列表,Python 3 中返回迭代器,需要使用 list 方法再生成列表。
  • map 函數不僅支持自定義的函數和 lambda 函數,還支持 Python 自帶的函數。
  • 如下所示,map 函數應用,將計算平方的 lambda 函數映射于列表中的每個元素:
>>> l = map(lambda x: x ** 2, [1, 2, 3, 4, 5]) >>> print(l) <map object at 0x03553790> >>> print(list(l)) [1, 4, 9, 16, 25]
  • map 函數還支持多個列表的映射和計算,如下所示:
>>> l1 = [1, 2, 3] >>> l2 = [4, 5, 6, 7] >>> l3 = [8, 9] >>> print(list(map(lambda x,y,z:x+y+z, l1, l2, l3))) [13, 16]
  • lambda 函數中的 x, y, z 分別對應列表 l1、l2 和 l3 中的元素,計算后的生成的列表長度取決于各個列表的最短長度。
  • 下面來看一道關于 map 函數的經典考題:有兩個字符串 A 和 B,現在要統計字符串 A 中有多少個字符也在字符串 B 中可以找到,常規函數解法如下:
>>> strA = "aAAAbBCC" >>> strB = "aA" >>> def count1(str1, str2):a = 0for c in str1:if c in str2:a += 1return a>>> count1(strA, strB) 4
  • 使用 map 函數經典解法如下:
>>> strA = "aAAAbBCC" >>> strB = "aA" >>> print(sum(map(strA.count, strB))) 4
  • 來分析下上面這段代碼,Python 自帶的 string.count(char) 函數的作用是統計一個字符串 string 含有字符 char 的數量,在本例中 strB 相當于 char 的一個參數列表 [“a”, “A”],map 函數先統計 strA 中字符 a 的數量,再統計 strA 中字符 A 的數量,獲得列表 [1, 3],然后將它們相加,即可獲得字符串 A 中總共有多少字符可以在 B 中找到。

六、reduce 函數

  • reduce() 函數會對參數序列中元素進行累積,該方法第一個參數必需是函數,而且傳入的函數必需要有 2。個參數,否則出現錯誤。該方法將一個數據集合(列表,元組等)中的所有數據進行下列操作:用傳給 reduce 中的函數 function 先對集合中的第 1、2 個元素進行操作,得到的結果再與第三個數據用 function 函數運算,最后得到一個結果。
  • reduce 函數很適合連續計算(比如列表求和或連乘計算階乘),經典代碼如下:
>>> from functools import reduce >>> reduce(lambda x, y: x+y, [1,2,3,4,5]) 15 >>> reduce(lambda x,y:x*y,range(1,5)) 24
  • Python 3 中 reduce() 函數已經被從全局名字空間里移除了,它現在被放置在 fucntools 模塊里,如果想要使用它,則需要通過引入 functools 模塊來調用 reduce() 函數。

七、filter 函數

  • Python 的 filter() 函數用于過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。該方法與 map 和 reduce 類似,第一個參數都是函數,作用于可以迭代的對象比如列表和元組,但不同的是 filter 方法傳入的函數是判斷性函數,只有符合條件的列表元素才會加入新的列表。Python 2 中返回列表,Python 3 中返回 filter 對象,使用 list 方法可以轉化為列表。
  • 如下所示,使用 filter 方法打印出 10 以內偶數,只有滿足 x % 2 == 0 的列表元素才會加入新的列表:
>>> l = filter(lambda x: x % 2 == 0, range(10)) >>> print(l) <filter object at 0x02C0BBF0> >>> print(list(l)) [0, 2, 4, 6, 8]
  • 利用 filter 方法刪除字符串列表里的空白字符串,只有滿足 s and s.strip() = True 的字符串才會加入新的列表:
def not_empty(s):return s and s.strip()list(filter(not_empty, ['A', '', 'B', None, 'C', ' '])) # 結果: ['A', 'B', 'C']
  • 如下所示,是一道關于 filter 方法的經典面試題,利用 filter 方法篩選出一個列表中的素數:
>>> import math >>> def isPrime(n):if n <= 1:return Falseelif n == 2:return Trueelse:for i in range(2, int(math.sqrt(n))+1):if n%i == 0:return Falsereturn True>>> l1 = [-1, 0, 2, 3, 6, 7, 8] >>> l2 = list(filter(isPrime, l1)) >>> print(l2) [2, 3, 7]

總結

以上是生活随笔為你收集整理的Python之列表表达式及高阶函数lamda、zip、enumerate、map和filter方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。