sortedでkeyにlambda使ったやり方

sortedでkeyにlambda使った物をよく見かけるのでまとめておきます

sorted((list or dict) key=lambda x: x[0])

こんなのです

で使い方としては

sorted(【リストor辞書】, key=lambda x: 【keyにしたい要素】)

こんな感じです

例としては

dictionary = [['な',3], ['か',4], ['と',1], ['お',2]]

print(dictionary) # [['な', 3], ['か', 4], ['と', 1], ['お', 2]]

sorted_dict = sorted(dictionary, key=lambda x: x[0])

# [['お', 2], ['か', 4], ['と', 1], ['な', 3]]

sorted_dict= sorted(dictionary, key=lambda x: x[1])

# [['お', 2], ['か', 4], ['と', 1], ['な', 3]]

sorted関数のkeyに「要素xを受け取り、x[1]を返す」というlambda式を指定している. 従って,sorted関数は、リストの2番目の要素をkeyとしてソートを行うようになった.

また、keyを関数として指定も可能

dictionary = [['なら',3], ['かながわ',4], ['とうきょう',1], ['おおさか',2]]

print(dictionary) # [['なら', 3], ['かながわ', 4], ['とうきょう', 1], ['おおさか', 2]]

def get_value(name_and_value):
    name, value = name_and_value
    return value

sortedDict = sorted(dictionary, key=get_value)

print(sortedDict) # [['おおさか', 2], ['かながわ', 4], ['とうきょう', 1], ['なら', 3]]

def get_name(name_and_value):
    name, value = name_and_value
    return name

sortedDict = sorted(dictionary, key=get_name)

print(sortedDict) # [['とうきょう', 1], ['おおさか', 2], ['なら', 3], ['かながわ', 4]]

その他の例1

class Hoge:
    def __init__(self, i, name):
      self.i = i
      self.name = name
    def __repr__(self):
      return "%d:%s" % (self.i, self.name)

l2 = [Hoge(2, 'c'), Hoge(3, 'a'), Hoge(1, 'b')]
print(l2) #[2:c, 3:a, 1:b]
sort_result = sorted(l2, key=lambda h: h.name)
print(sort_result) #[3:a, 1:b, 2:c]

上記の例はHogeオブジェクトのname属性を返す関数を指定したことで、name属性でソートしている

その他の例2 operatorモジュールのattrgetter関数を用いた物

特定の属性を返す関数は、operatorモジュールのattrgetter関数を使えば簡単に作成できる。

>>> import operator
>>> l2 = [Hoge(2, 'c'), Hoge(3, 'a'), Hoge(1, 'b')]
>>> sorted(l2, key=operator.attrgetter('name'))
[3:a, 1:b, 2:c]

参考

https://qiita.com/n10432/items/e0315979286ea9121d57

https://python.civic-apps.com/sort-sorted/