對Python中lambda方法的理解——以詞典(dic)值(value)排序爲例

每次在任務中需要以詞典的值排序,我都會百度一下解決,巧的是每次解決之後,我都會說下次一定不百度。嗯,“真香”。所以趁着這次在家,抽出時間好好理解一下其中看起來最複雜的lambda部分,到底是幹什麼的。

1. 簡述lambda

     首先,lambda可以理解爲函數式的另一種寫法,這種寫法沒有函數名、不能寫判斷、循環和輸出等,且定義之後不能共享使用。關於lambda和def的區別可以看文章1,總結得很好。

     其次,lambda的語法爲: lambda 變量名: 對變量執行的語句(返回處理後的結果)

     在文章2中給出了lambda和def函數式的轉化形式:

# lambda函數式
lambda x: x**2

# 效果等同於下面的def函數式
def fun(x):
    return x**2

     個人感覺lambda靈活的使用能減少省去一些只做簡單處理的函數:

# 舉個例子
# 原始代碼
def fun1(x):
    return x+1

def fun2(x):
    return x**2

def fun3(x):
    return str(x)

a = 1
print(fun3(fun2(fun1(a))))


# 其效果等同於
lis = [lambda x: x + 1, lambda x: x ** 2, lambda x: str(x)]
print(lis[2](lis[1](lis[0](1))))

      文章2中說lambda可以接對象,如列表和詞典。所以在對詞典值進行排序的時候,我們會使用sorted()方法+lambda來代替直接循環詞典的方式。

2 對詞典排序的解析

      sorted(iterable, key, reverse)可以填三個參數:

  1. 第一個(iterable)是必填,爲需要排序的對象;
  2. 第二個(key)爲選填,爲指定的排序;
  3. 第三個(reverse)爲選填,爲是否逆序,True爲逆序,False爲升序。默認False。

     對於詞典key的排序很簡單,直接使用sorted(dic)即可返回按key升序排列的列表結果。但對詞典value的排序需要引入lambda,目的是獲取詞典中的value,從而輔助sorted()方法的選值。我們提供兩種寫法:

  1. 使用lambda x: dic[x] 獲取詞典中的值;
  2. 引入dic.items(),通過items返回的列表套元組對象(形如:[('a',1), ('b',3)..]),使用 lambda x: x[1]獲取value。

     最後將獲取的詞典的值設置爲sorted()方法中第二個參數指定排序對象key的值,完成我們的按值排序。

     下面是一些實驗和結果用於參考:

dic = {'b': 1, 'c': 2, 'a': 3}
print(dic)
# {'b': 1, 'c': 2, 'a': 3}
print(sorted(dic))
# ['a', 'b', 'c']
print(sorted(dic, reverse=False))
# ['a', 'b', 'c']
print(sorted(dic, key=lambda x: dic[x], reverse=True))
# ['a', 'c', 'b']
print(sorted(dic.items(), key=lambda x: x[1], reverse=False))
# [('b', 1), ('c', 2), ('a', 3)]
print(dic.items())
# dict_items([('b', 1), ('c', 2), ('a', 3)])

3 總結

     一個lambda就是個小花式,可以代替某些“雞肋def函數”,可以在以後的代碼中活用起來。其次,sorted()方法排序,除了對單一列排序外,還能對多列元素排序(key的部分改寫成lambda x: (x[1], x[0]),具體不贅述)。最後,弱弱的說一句,Pandas的sort_values()真香。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章