要素の並べ替え

要素の並べ替え

list.sort():昇順・降順に並べ替える

 数値を要素にもつリストに対して sort()メソッド を呼びだすと、要素を昇順あるいは降順に並び替えることができます

 list.sort(key, reverse)

 引数 reverse に False を指定するか省略すると 昇順、True を指定すると 降順 です。

# SORT_01-1

# リストを作成
num1 = [4, 2, 5, 1, 3]

# 昇順に並び替える
num1.sort()
print(num1)
[1, 2, 3, 4, 5]
# リストST_01-2

# リストを作成
num2 = [4, 2, 5, 1, 3]

# 降順に並び替える
num2.sort(reverse = True)
print(num2)
[5, 4, 3, 2, 1]

 

key を指定して要素を並べ替える

 今度は二種類のデータが一組となった要素をもつリストを考えてみましょう。
 例として、惑星の軌道長半径 (AU) と、質量 (1024kg) がペアになった一続きのデータを用意します。ちなみに軌道長半径とは惑星が楕円軌道を描くときの長いほうの半径、大まかにいえば太陽からの距離を意味します。AU は地球の軌道長半径を 1 とした単位です。軌道長半径と質量はタプルの形式 [軌道長半径, 質量] でデータを作り、それぞれのタプルをリストの要素として並べます。初期状態では太陽から近いほうから「水・金・地・火・木・土」の順に並んでいます。これを質量の小さい順に並べることを考えてみます。

 sort()メソッドの第1引数 key には関数を指定します。このようなケースでは一般に lambda 式とよばれる無名関数が使われます。lambda 式についての詳しい解説 は別の記事に譲りますが、ともかくこのように書けば、タプルの中の好きな要素をキーとして並べ替えることができることを知っておくと、色々な場面に応用できます。

# SORT_02

# 水星,金星,地球,火星,木星,土星
# (軌道長半径[AU],質量[1024kg])

planets = [(0.387,0.33),(0.723,4.87),(1,5.97),(1.524,0.942),(5.204,1898),(9.582,568)]

# タプルの2番目の要素(質量)を key に昇順に並び替えます
planets.sort(key = lambda tup: tup[1])

print(planets)
[(0.387, 0.33), (1.524, 0.942), (0.723, 4.87),
(1, 5.97), (9.582, 568), (5.204, 1898)]

 2 番目の要素を key にするので、インデックスは 1 であることに注意してください。
 lambda 式の変数はタプルであることがわかりやすいように tup としてありますが、この部分はどんな変数名でも構いません。要するに

planets.sort(key = lambda x: x[1])

のように記述すると、タプルの 2 番目の要素をキーに並び替えるということです。
 

itemgetter() を使って並び替える

 lambda 式を使うより、operator モジュールから itemgetter()関数を呼びだすほうが簡潔なコードになります。

# SORT_03

# itemgetter関数をインポート
from operator import itemgetter

# 水星,金星,地球,火星,木星,土星
# (軌道長半径[AU],質量[1024kg])
planets = [(0.387,0.33),(0.723,4.87),(1,5.97),(1.524,0.942),(5.204,1898),(9.582,568)]

# 質量をキーにリストを並べ替える
planets.sort(key = itemgetter(1))

print(planets)
[(0.387, 0.33), (1.524, 0.942), (0.723, 4.87),
(1, 5.97), (9.582, 568), (5.204, 1898)]

 上のコードでは itemgetter() の引数でタプルのインデックスを指定しています。
 

ビジネスPython超入門

新品価格
¥2,592から
(2019/8/21 23:35時点)

sorted():昇順・降順に並べ替える

 sorted()関数 はリストのもつ sort()メソッドによく似た機能をもちますが、リストだけでなく、set やタプル、あるいは文字列なども引数に指定して並び替えることができます。

 sorted(iterable, key = None, reverse = False

 オプション引数 key は上で説明した sort()メソッドと同じように関数を指定しますが、昇順・降順に並び替えるだけなら省略して構いません。reverse に False を指定すると昇順、True を指定すると降順に並び替えます (デフォルトは False)。

アルファベットを昇順・降順に並べ替える

 sort()メソッドや sorted()関数を使うと、アルファベットを昇順または降順に並び替えることもできます。アルファベットの昇順とは、a, b, c, d, e, ...... という並び順のことです。

 リストの各要素にアルファベット1文字を収めて、並べ替えのテストをしてみます。

# SORTED_01

# アルファベットのリストを定義
# chr は character(文字)の略
chr = ["D", "A", "C", "E", "B"]

# 文字を昇順(アルファベット順)に並び替え
# asc は ascending order(昇順の略)
chr_asc = sorted(chr)

# 文字を降順(アルファベット逆順)に並び替え
# des は descending order(降順の略)
chr_des = sorted(chr, reverse = True)

print(chr_asc)
print(chr_des)
['A', 'B', 'C', 'D', 'E']
['E', 'D', 'C', 'B', 'A']

 大文字と小文字の並び順も確認しておきましょう。

# 大文字と小文字の混ざったリストを定義
chr = ["a", "A", "b", "B", "c", "C"]

# 昇順に並び替え
chr = sorted(chr)

print(chr)
['A', 'B', 'C', 'a', 'b', 'c']

 大文字が小文字より先に並びました。ちなみに、日本語のひらがなやカタカナは sorted 関数の機能に対応していないので、五十音順に並べ替えることはできません。
 

文字列の並び替え

 sorted() は文字列を引数に指定することもできます。
 試しにアルファベットの文字列を昇順に並び替えてみましょう。

# SORTED_02

# 文字列を定義
my_str = "DACEB"

# アルファベットを昇順に並べたリストを作成
my_str = sorted(my_str)

print(my_str)
['A', 'B', 'C', 'D', 'E']

 確かに並び替えられましたけど、データ型がリストになってしまっています。このように、sorted 関数に引き渡したデータはすべて list 型となって戻ってきます。文字列で返してもらうには、join()メソッドでリストの要素を結合します。

# SORTED_03

# 文字列を定義
my_str = "DACEB"

# アルファベットを昇順に並べたリストを作成
my_str = sorted(my_str)

# リストの要素を再び結合
my_str = ''.join(my_str)

print(my_str)
ABCDE

 このような処理を頻繁に行うのであれば、次のような関数を作っておくと便利です。

# SORTED_04

# 文字列を昇順・降順に並び替える関数
def str_sort(x, s = False):
    y = sorted(x, reverse = s)
    return ''.join(y)

my_str = "DACEB"

# str_sort 関数を使って降順に並び替えます
my_str = str_sort(my_str, True)

print(my_str)
EDCBA

 str_sort 関数の引数 s は降順にするかどうかのオプション引数で、デフォルトでは False になっています。降順に並び替えたい場合は True を指定します。
 

タプルの並び替え

 sorted() の引数にタプルを指定しても、やはりリスト型で戻ってきます。

# SORTED_05

# タプルを定義
num_tup = (1, 2, 3, 4, 5)

# タプルの要素を降順に並べ替えたリストを作成
num_list = sorted(num_tup, reverse = True)

print(num_list)
[5, 4, 3, 2, 1]

 タプルを渡して並び替えたうえで、やはりタプルで返してもらうならば、先ほどの文字列の場合と同様に、タプル専用の並び替え関数を作っておきます。

# SORTED_06

# タプルを昇順・降順に並び替える関数
def tup_sort(x, s = False):
    y = sorted(x, reverse = s)
    return tuple(y)

# タプルを定義
num_tup = (1, 2, 3, 4, 5)

# 関数を使ってタプルを降順に並び替えます
num_tup = tup_sort(num_tup, True)

print(num_tup)
(5, 4, 3, 2, 1)

 

list.reverse():並び順を反転

 list.reverse() はリストの要素を逆順に並び替えます。

# REVERSE

# リストを定義
framework = ["Django", "Flask", "Plone", "Bottle"]

# 並び順を反転
framework.reverse()

print(framework)
['Bottle', 'Plone', 'Flask', 'Django']