最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python之lambda表達(dá)式與sort函數(shù)中的key用法

 更新時(shí)間:2023年08月24日 08:39:00   作者:愿此后再無WA  
這篇文章主要介紹了python之lambda表達(dá)式與sort函數(shù)中的key用法,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

python lambda表達(dá)式與sort函數(shù)中的key

lambda表達(dá)式

lambda 表達(dá)式常用來聲明匿名函數(shù),也就是沒有函數(shù)名字的、臨時(shí)使用的小函數(shù),常用在臨時(shí)需要一個(gè)類似于函數(shù)的功能但又不想定義函數(shù)的場合。

例如,內(nèi)置函數(shù)sorted()和列表方法sort()的 key參數(shù),內(nèi)置函數(shù)map()和filter()的第一個(gè)參數(shù)等。當(dāng)然,也可以使用lambda表達(dá)式定義具名函數(shù)。

lambda表達(dá)式只可以包含一個(gè)表達(dá)式,不允許包含復(fù)雜語句和結(jié)構(gòu),但在表達(dá)式中可以調(diào)用其他函數(shù),該表達(dá)式的計(jì)算結(jié)果相當(dāng)于函數(shù)的返回值。

下面的代碼演示了不同情況下 lambda表達(dá)式的應(yīng)用。

簡言之:

lambda表達(dá)式就是函數(shù)的迷你版,如果定義的函數(shù)比較簡單可以使用lambda代替。

>>> def func(a,b,c):
?? ?return a+b+c
>>> f = lambda a,b,c:a+b+c ?# 與func函數(shù)等價(jià)
>>> f(1,2,3) # 輸出6
>>> s = lambda a,b=5,c=1:a+b+c ?# 支持默認(rèn)參數(shù)
>>> s(8) ?# 輸出14
>>> s = "abcde"
>>> tuple(map(lambda x:x.upper(),s)) ?# lambda 也可以作為函數(shù)參數(shù)
('A', 'B', 'C', 'D', 'E')

咳咳,我說一下map函數(shù),真的太頂了。它有兩個(gè)參數(shù)嘛,第二個(gè)參數(shù)是一個(gè)可迭代對象,列表,元組,字符串,集合,字典那些,第一個(gè)參數(shù)一般就是一個(gè)功能函數(shù)來的,map函數(shù)大概就是,將迭代對象里面的每一個(gè)元素都傳那個(gè)功能函數(shù)進(jìn)行處理,以上面例子為例,將字符串s里面的每一個(gè)小寫元素通過lambda表達(dá)式函數(shù)轉(zhuǎn)換為大寫,存到map對象里面,如果要看結(jié)果的話要用list,tuple這些數(shù)據(jù)類型將其強(qiáng)制轉(zhuǎn)換出來顯示,不然看不到。

sort函數(shù)

最后就是經(jīng)典的與sort函數(shù)搭配了。

假設(shè)有一個(gè)二維列表,我們以第二維元素值的大小對列表進(jìn)行排序。

那么他的寫法應(yīng)該是這樣的。

>>> a = [[1,4],[2,3],[5,1]]
>>> a
[[1, 4], [2, 3], [5, 1]]
>>> sorted(a,key=lambda x:x[1]) ? # 用sorted是不想修改a
[[5, 1], [2, 3], [1, 4]] ? ? # 可以看到生成了按嵌套列表中第二個(gè)元素排序的列表

或許有些讀者跟我剛才一樣,知道這樣寫,但不知道怎么來的。于是我特地找了一些資料,大概的用法就是如果指定key的話就會先遍歷一遍可迭代對象,得到每個(gè)元素的key值,然后根據(jù)這個(gè)key值進(jìn)行排序。

相當(dāng)于 for i in a,然后指定對i的某種操作,當(dāng)然,要寫成函數(shù)的形式才行。

如果寫成一般函數(shù)的話是這種形式。

>>> a = [[1,4],[2,3],[5,1]]
>>> def func(nums): ?# 這里的nums相當(dāng)于是a中的每個(gè)元素 也就是[1,4],[2,3],[5,1]
?? ?return nums[1]
# 注意注意!這里要格外注意,這里的key中func沒有括號沒有參數(shù)只有名字,相當(dāng)于就是將a中的每個(gè)元素[1,4],[2,3],[5,1]分別去調(diào)用func函數(shù)得到一個(gè)key值,最后根據(jù)這個(gè)k值進(jìn)行排序。
>>> sorted(a,key=func) ?
[[5, 1], [2, 3], [1, 4]]

當(dāng)我們大概知道了這個(gè)sort如何排序之后,其他多騷的寫法都能寫得出來,現(xiàn)在我們就試試。

>>> def func(string): ? # 定義一個(gè)函數(shù)
?? ??? ?res = len(set(string)) ? ?# ?首先計(jì)算這個(gè)單詞有多少個(gè)字母 如“aaabb”算兩個(gè)字母
?? ??? ?for i in string:
?? ??? ??? ?if i.isupper(): ?# 如果是大寫
?? ??? ??? ??? ?res *=1.15 * ord(i) ?# ord表示 i 在 ASCII 對應(yīng)的值
?? ??? ??? ?else:
?? ??? ??? ??? ?res*=1.05 * ord(i)
?? ??? ?return res?
>>> a = "haHASHSADHn IamaHandsomeBoy ?SLSKJlkjSLSjGHUh ?iljEILNGLKD".split()
>>> sorted(a,key=func) ?# 記住不要括號
['haHASHSADHn', 'iljEILNGLKD', 'IamaHandsomeBoy', 'SLSKJlkjSLSjGHUh']

騷寫法寫得出來,簡單的寫法就迎刃而解了。當(dāng)然,使用lambda表達(dá)式前提是你對排序的定義足夠簡單,就是按哪個(gè)哪個(gè)排序的。復(fù)雜一點(diǎn)的話就要像上面一樣自定義函數(shù)了。

下面看一下使用lambda對字典以值(值噢,而不是鍵)進(jìn)行排序。

>>> a
{1: 5, 2: 3, 7: 6, 5: 2}
>>> sorted(a) ?# 如果直接寫的話只會對鍵排序,沒有達(dá)到我們想要的效果。
[1, 2, 5, 7]
>>> a.sort() ? # 如果直接使用sort會報(bào)錯(cuò),因?yàn)樽值錄]有這個(gè)函數(shù)
Traceback (most recent call last):?
? File "<pyshell#47>", line 1, in <module>
? ? a.sort()
AttributeError: 'dict' object has no attribute 'sort'
>>> sorted(a.items(),key=lambda x:x[1]) ?# 因?yàn)殒I值我們都要,所以要使用a.items(),然后以每個(gè)元素的第二個(gè)值作為key值進(jìn)行排序,得到下面的結(jié)果
[(5, 2), (2, 3), (1, 5), (7, 6)] ? ?# 我們想要的應(yīng)該是排序后的字典,而這個(gè)還不是,但是有點(diǎn)像,我們可以直接使用dict函數(shù)強(qiáng)制轉(zhuǎn)換成字典。
>>> dict(sorted(a.items(),key=lambda x:x[1]))
{5: 2, 2: 3, 1: 5, 7: 6} ? # 搞定

python匿名函數(shù)lambda表達(dá)式與sort()、sorted()、min()、max()、map()、reduce()、filter()使用

1. 什么是匿名函數(shù)

匿名函數(shù),即沒有函數(shù)名稱的函數(shù)。學(xué)過Python的都知道,Python中函數(shù)的定義格式為:(關(guān)鍵字)def(加)(函數(shù)名)get_name:(函數(shù)體),但是匿名函數(shù)沒有函數(shù)名稱,它的定義格式為:lambda [arg1,[arg2,arg3…]]: expression,因此匿名函數(shù)又被成為lambda表達(dá)式,它只包含一行表達(dá)式。

2. lambda表達(dá)式

定義格式:lambda [arg1,[arg2,arg3…]]: expression,其中l(wèi)ambda為必須的關(guān)鍵字,args表示參數(shù)列表,expression表示表達(dá)式。

為便于理解,該語法格式轉(zhuǎn)為普通函數(shù)格式如下:

def fun_name(arg1,[arg2,arg3..]):
	return expression
fun_name(arg1,[arg2,arg3..])

顯然,使用普通方法定義此函數(shù),需要 3 行代碼,而使用 lambda 表達(dá)式僅需 1 行。

舉個(gè)例子:

def square(x):
	return x ** 2
print(square(5))
# 此處只是為了舉例,平常不建議這樣將lambda表達(dá)式賦值給變量
a = lambda x: x ** 2
print(a(5))

運(yùn)行結(jié)果

25

25

3. lambda表達(dá)式的用途

lambda表達(dá)式只有一行,相比于函數(shù),它具有的優(yōu)勢:

  • 對于單行函數(shù),使用 lambda 表達(dá)式可以省去定義函數(shù)的過程,讓代碼更加簡潔;
  • 對于不需要多次復(fù)用的函數(shù),使用 lambda 表達(dá)式可以在用完之后立即釋放,提高程序執(zhí)行的性能。

那么,lambda表達(dá)式的使用方式有哪些呢:

1.排序,結(jié)合sorted() 和sort()方法使用

# 方式1
list1 = [1, 2, 6, 9, 3, 5, 4, 0]
list1.sort(key=lambda x: x)
# lambda x: x中第一個(gè)x為參數(shù),此時(shí)是list1中的每個(gè)元素,第二個(gè)x是表達(dá)式,此時(shí)也表示list1中的每個(gè)元素
# 通過在第二行打斷點(diǎn),然后調(diào)試運(yùn)行,會發(fā)現(xiàn)表達(dá)式x,會被依次賦值為列表
# list1中的每個(gè)值
print(list1)
# 方式2
# list2 中記錄名字和他的年齡
list2 = [['小明', 23], ['大美', 22], ['小帥', 18], ['張三', 24]]
list3 = sorted(list2, key=lambda x: x[1])
# lambda x: x[1]中第一個(gè)x為參數(shù),此時(shí)是list2中的每個(gè)元素,此時(shí)是列表,
# 即'['小明', 23]';第二個(gè)x[1]是表達(dá)式,此時(shí)表示列表中第二個(gè)值,即23
# 表示按照每個(gè)人的年齡排序
print(list3)
# 方式3
list4 = ['3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
t = ['3', '3', '4', '6', '5', '8', '7', '10', '10', 'K', 'A', 'J', 'Q']
t.sort(key=lambda x: list4.index(x))
# lambda x: list4.index(x)中第一個(gè)x為參數(shù),此時(shí)是t中的每個(gè)元素
# list4.index(x)是表達(dá)式,表示x在list4中的索引值,表示按照索引值大小排序
print(t)

輸出結(jié)果:

[0, 1, 2, 3, 4, 5, 6, 9]
[[‘小帥’, 18], [‘大美’, 22], [‘小明’, 23], [‘張三’, 24]]
[‘3’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘10’, ‘10’, ‘J’, ‘Q’, ‘K’, ‘A’]

2.結(jié)合max()、min()使用

list2 = [['小明', 23], ['大美', 22], ['小帥', 18], ['張三', 24]]
list5 = [2, 10, 4, 3, 1, 2, 6, 8, 7]
res = max(list5, key=lambda x: x)
print(res)
name_age = min(list2, key=lambda x: x[1])
print(name_age)

輸出結(jié)果:

10
[‘小帥’, 18]

3.結(jié)合map()函數(shù)使用

# ===========一般寫法:===========
# 1、計(jì)算平方數(shù)
list6 = [2,3,6,1,5]
def square(x):
	return x ** 2
s = list(map(square, list6))	# 計(jì)算列表各個(gè)元素的平方
print(s)
# ===========匿名函數(shù)寫法:============
# 2、計(jì)算平方數(shù),lambda 寫法
s1 = list(map(lambda x: x ** 2, list6))
print(s1)
# 3、提供兩個(gè)列表,將其相同索引位置的列表元素進(jìn)行相加
list7 = [1,2,34,6]
s2 = list(map(lambda x, y: x + y, list7, list6))
print(s2)

輸出結(jié)果:

[4, 9, 36, 1, 25]
[4, 9, 36, 1, 25]
[3, 5, 40, 7]

4.結(jié)合reduce()使用

reduce函數(shù)是Python中的內(nèi)置函數(shù),用于計(jì)算可迭代對象的累積結(jié)果。

reduce 函數(shù)的用法和示例:

reduce(function, iterable[, initializer])
  • 函數(shù)定義:對可迭代對象中的元素進(jìn)行累積操作,返回一個(gè)單一的結(jié)果。
  • 參數(shù) function:用于累積操作的函數(shù),接受兩個(gè)參數(shù),必須返回一個(gè)值。
  • 參數(shù) iterable:可迭代對象,包含要進(jìn)行累積操作的元素。
  • 參數(shù) initializer:可選參數(shù),作為累積的初始值。如果提供了初始值,則累積操作從初始值開始;如果未提供初始值,則累積操作從可迭代對象的第一個(gè)元素開始。
from functools import reduce
list8 = [5, 6, 7, 4, 3, 2, 1]
# 此時(shí)初始值默認(rèn)為列表第一個(gè)元素,計(jì)算元素的和
s3 = reduce(lambda x, y: x + y, list8)
print(s3)
# 定義初始值為0,計(jì)算列表元素的平方和
s4 = reduce(lambda x, y: x + y ** 2, list8, 0)
print(s4)
# 計(jì)算n的階乘
n = 5
s5 = reduce(lambda x, y: x * y, range(1, n + 1))
print(s5)
# 計(jì)算最大值
s6 = reduce(lambda x, y: x if x > y else y, list8)
print(s6)

輸出結(jié)果:

28
140
120
7

5.結(jié)合filter()使用

filter函數(shù)用于過濾序列,過濾掉不符合條件的元素

filter(function, iterable)
  • function:用于過濾的函數(shù)
  • iterable:可迭代對象
list9 = [1, 2, 3, 4, 5, 6, 7, 8]
# 保留偶數(shù)
s7 = list(filter(lambda x: x % 2 == 0, list9))
print(s7)

輸出結(jié)果:

[2, 4, 6, 8]

心得:

1.lambda表達(dá)式可直接賦值給變量

2.lambda表達(dá)式可結(jié)合函數(shù)使用,若函數(shù)中帶有參數(shù)key或這參數(shù)function,如sort()、sorted()、min()、max()、map()、reduce()、filter()等

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • PyTorch 1.0 正式版已經(jīng)發(fā)布了

    PyTorch 1.0 正式版已經(jīng)發(fā)布了

    今天小編就為大家分享一篇關(guān)于PyTorch 1.0 正式版已經(jīng)發(fā)布了!小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Python繪制散點(diǎn)圖的教程詳解

    Python繪制散點(diǎn)圖的教程詳解

    散點(diǎn)圖是指在回歸分析中,數(shù)據(jù)點(diǎn)在直角坐標(biāo)系平面上的分布圖,散點(diǎn)圖表示因變量隨自變量而變化的大致趨勢,據(jù)此可以選擇合適的函數(shù)對數(shù)據(jù)點(diǎn)進(jìn)行擬合。本文將用Python繪制散點(diǎn)圖,需要的可以參考一下
    2022-03-03
  • Python+Opencv實(shí)現(xiàn)圖像匹配功能(模板匹配)

    Python+Opencv實(shí)現(xiàn)圖像匹配功能(模板匹配)

    這篇文章主要為大家詳細(xì)介紹了Python+Opencv實(shí)現(xiàn)圖像匹配功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Python多進(jìn)程中避免死鎖問題的六種策略

    Python多進(jìn)程中避免死鎖問題的六種策略

    死鎖是Python多進(jìn)程開發(fā)中最容易踩的坑之一,一旦出現(xiàn)會導(dǎo)致進(jìn)程卡死、程序無響應(yīng),甚至需要強(qiáng)制終止才能恢復(fù),所以本文給大家介紹了Python多進(jìn)程中避免死鎖問題的六種策略,需要的朋友可以參考下
    2025-12-12
  • 如何在python中使用openpyxl庫讀寫Excel.xlsx文件(有參考列程)

    如何在python中使用openpyxl庫讀寫Excel.xlsx文件(有參考列程)

    這篇文章主要給大家介紹了關(guān)于如何在python中使用openpyxl庫讀寫Excel.xlsx文件的相關(guān)資料,openpyxl是一個(gè)第三方庫,可以處理xlsx格式的Excel文件,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • Python Transformer 庫安裝配置及使用方法

    Python Transformer 庫安裝配置及使用方法

    Hugging Face Transformers 是自然語言處理(NLP)領(lǐng)域最流行的開源庫之一,支持基于 Transformer 架構(gòu)的預(yù)訓(xùn)練模型(如 BERT、GPT、T5 等),覆蓋文本、圖像、音頻等多模態(tài)任務(wù),本文介紹Python 中的 Transformer 庫及使用方法,感興趣的朋友一起看看吧
    2025-04-04
  • python網(wǎng)絡(luò)通信圖文詳解

    python網(wǎng)絡(luò)通信圖文詳解

    這篇文章主要介紹了Python網(wǎng)絡(luò)編程詳解,涉及具體代碼示例,還是挺不錯(cuò)的,這里分享給大家,供需要的朋友參考,希望能給你帶來幫助
    2021-08-08
  • python中Tkinter詳細(xì)基礎(chǔ)教學(xué)實(shí)例代碼

    python中Tkinter詳細(xì)基礎(chǔ)教學(xué)實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于python中Tkinter詳細(xì)基礎(chǔ)教學(xué)的相關(guān)資料,文中介紹了如Label、Button、Entry、Text、Frame、Menu、Canvas、Messagebox等的基本屬性和用法,并介紹了布局管理器pack、grid和place的使用方法,需要的朋友可以參考下
    2024-12-12
  • 利用Python解決Excel問題的最佳方案總結(jié)

    利用Python解決Excel問題的最佳方案總結(jié)

    python處理excel文件有很多方法,最開始接觸的是xlrd、xlsxwriter模塊,分別用于excel文件的讀、寫,后來又學(xué)習(xí)了openpyxl模塊,可以同時(shí)完成excel文件的讀、寫,下面這篇文章主要給大家介紹了關(guān)于利用Python解決Excel問題的最佳方案,需要的朋友可以參考下
    2023-04-04
  • Python列表內(nèi)存存儲本質(zhì)之存儲差異原因與優(yōu)化建議總結(jié)

    Python列表內(nèi)存存儲本質(zhì)之存儲差異原因與優(yōu)化建議總結(jié)

    在Python中,列表(list)作為最常用的數(shù)據(jù)結(jié)構(gòu)之一,其內(nèi)存存儲機(jī)制直接影響程序性能,下面這篇文章主要介紹了Python列表內(nèi)存存儲本質(zhì)之存儲差異原因與優(yōu)化建議的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-09-09

最新評論

临沭县| 博罗县| 承德市| 杨浦区| 鲁甸县| 阳新县| 平谷区| 集贤县| 大英县| 左权县| 从化市| 师宗县| 鄂托克前旗| 恩平市| 南投县| 繁昌县| 南陵县| 清苑县| 永济市| 泾阳县| 灵武市| 河曲县| 盐亭县| 锦屏县| 渝中区| 巫山县| 奈曼旗| 德阳市| 开鲁县| 仁怀市| 天等县| 洪江市| 社旗县| 保康县| 邳州市| 保德县| 揭阳市| 大田县| 内丘县| 福鼎市| 岗巴县|