読者です 読者をやめる 読者になる 読者になる

Pythonプログラミング入門・サンプル・チュートリアル

Pythonプログラミング入門・サンプル・チュートリアル

【Pythonプログラミング入門】ソートの基本(sorted()関数やsort()メソッド)

Python Python3 サンプル プログラミング 入門 ソート sort

この記事を読んでわかること

  • sorted()関数やsort()メソッドの基礎的な使い方

sorted()関数とsort()メソッドの違い

  • sorted()関数は新しくリストオブジェクトを作成し、結果を返す
  • sort()メソッドはオブジェクトを直接変更する
  • sorted()関数はリスト以外にも使える。例えば、辞書。

ソートの基礎

# 数値のリストをソートする
numbers = [5,4,3,1,2]

# sorted()関数は新しくリストオブジェクトを作成し、結果を返す
print(sorted(numbers))
print(numbers)

# sort()メソッドはオブジェクトを直接変更する
numbers.sort()
print(numbers)

# sorted()関数は辞書にも使える。
person_dic = {"yamada", "sato", "ohashi"}
print(sorted(person_dic))

# リスト以外ではsort()メソッドはエラーになる
person_dic.sort()
print(person_dic)

結果

f:id:fjswkun:20170312210911p:plain

keyパラメータ

# 比較に使用する要素を指定する
words = ["Hello", "world", "Wow", "Python", "!!!"]
print(sorted(words, key=str.lower))

words.sort(key=str.lower)
print(words)

# 複数の要素の中のいずれかをkeyに使用する
# 辞書の場合
friends = [
    {"name":"yamada", "hobby":"cooking"},
    {"name":"sato", "hobby": "travel"},
    {"name":"inoki", "hobby": "game"},
]
print(sorted(friends, key=lambda x: x["hobby"]))

friends.sort(key=lambda x: x["name"])
print(friends)

# オブジェクトの属性もkeyに使用できる
class Person:
    def __init__(self, name, hobby):
        self.name = name
        self.hobby = hobby
        
    def __repr__(self):
        return repr((self.name, self.hobby))

persons = [
    Person('yamada', 'cooking'),
    Person('sato', 'travel'),
    Person('inoki', 'game'),
]
print(sorted(persons, key=lambda x: x.hobby))

persons.sort(key=lambda x: x.name)
print(persons)

結果

f:id:fjswkun:20170312211058p:plain

operatorモジュール

# operatorモジュールを使うことでkeyパラメータの指定が楽になる
from operator import itemgetter, attrgetter
friend_tuples = [
    ('yamada', 'm', 28),
    ('tanaka', 'f', 33),
    ('yamada', 'f', 29),
]

# 2番目の要素で比較 ※0番目から開始
print(sorted(friend_tuples, key=itemgetter(2)))

# 複数の要素で比較。0番目の要素で比較、次に2番めの要素で比較
print(sorted(friend_tuples, key=itemgetter(0,2)))

class Person:
    def __init__(self, name, hobby):
        self.name = name
        self.hobby = hobby
        
    def __repr__(self):
        return repr((self.name, self.hobby))

persons = [
    Person('yamada', 'cooking'),
    Person('sato', 'travel'),
    Person('inoki', 'game'),
]

print(sorted(persons, key=attrgetter('hobby')))
print(sorted(persons, key=attrgetter('name', 'hobby')))

結果

f:id:fjswkun:20170312211225p:plain

昇順、降順

# reverseパラメータでTrueかFalseを指定する
# 初期値はFalse
friend_tuples = [
    ('yamada', 'm', 28),
    ('tanaka', 'f', 33),
    ('yamada', 'f', 29),
]

print(sorted(friend_tuples, key=lambda x: x[2], reverse=True))
print(sorted(friend_tuples, key=lambda x: x[2], reverse=False))

結果

f:id:fjswkun:20170312211248p:plain