リストの要素を昇順または降順に並び替える

作成済みのリストに含まれる要素を、要素の値を使って昇順または降順に並び替える方法について解説します。並び替えには sorted 関数、または sort メソッドを使用します。また並び替えを行う前に別の指定した関数を呼び出し、比較する値を変換してから並び替えを行う方法も解説します。

(Last modified: )

要素を並び替える

要素を並び替えるには組み込み関数の sorted 関数を使用します。書式は次のとおりです。

newlist = sorted(iterable, *, key=None, reverse=False)

1 番目の引数以外は省略可能となっており、基本となる使い方は次のようになります。

newlist = sorted(iterable)

1 番目の引数に指定したイテラブルなオブジェクト(文字列やリスト、タプル、辞書などです)の要素を並び替え、新しいオブジェクトとして返します。並べ替える前のオブジェクトはそのままで、並べ替えた結果を新しいリスト型のオブジェクトとして返してくれます。

並び替えは要素の値を < 演算子を使って比較して並び替えが行われます。あとで試しますが、リストの要素に数値や文字列が混在している場合、比較を行えず TypeError エラーが発生します。

具体的には次のように記述します。

mylist = ["C", "A", "B"]
newlist = sorted(mylist)

print(mylist)
--> ["C", "A", "B"]
print(newlist)
--> ["A", "B", "C"]

また対象がリストの場合には、 sort メソッドが用意されています。

リスト.sort(*, key=None, reverse=False)

こちらも引数はオプションです。基本となる使い方は次のようになります。

リスト.sort()

並び替えるという点では同じですが、sort メソッドの場合は同じオブジェクトのまま要素を並び替えます。

具体的には次のように記述します。

mylist = ["C", "A", "B"]
mylist.sort()

print(mylist)
--> ["A", "B", "C"]

並び替える前のリストオブジェクトが必要であれば sorted 関数を使い、必要なければどちらでも構わないかと思います。このページでは sorted 関数の方で試していきます。

サンプルコード

次の 2 つのサンプルを見てください。

numlist = [84, 75, 92, 90, 78]
newnumlist = sorted(numlist)

print("Before:", numlist)
>> Before: [84, 75, 92, 90, 78]
print("After: ", newnumlist)
>> After:  [75, 78, 84, 90, 92]
colorlist = ["Blue", "Red", "Green", "White", "Black"]
newcolorlist = sorted(colorlist)

print("Before:", colorlist)
>> Before: ['Blue', 'Red', 'Green', 'White', 'Black']
print("After: ", newcolorlist)
>> After:  ['Black', 'Blue', 'Green', 'Red', 'White']

sorted 関数を使ってリストの要素を並び替えることができました。

要素の値のデータ型が異なっていた場合

リストの要素にはそれぞれ異なるデータ型の値を持つことができますが、並び替えを行う場合は要素の値を > 演算子で比較するため、比較できるかどうかは > 演算子で比較が許されているかどうかによります。

例えば要素の値のデータ型が異なっていても整数と浮動小数点数などであれば並び替えは行えます。

numlist = [5, 3.14, 4.78, 4]

newnumlist = sorted(numlist)
print(newnumlist)
>> [3.14, 4, 4.78, 5]

ただ要素の値が数値と文字列が混在している場合などは並び替えを行うと TypeError エラーが発生します。

mylist = ["80", 75, 45, "68"]
newmylist = sorted(mylist)

>> Traceback (most recent call last):
>>   File "<stdin>", line 1, in <module>
>> TypeError: '<' not supported between instances of 'int' and 'str'

並べ替えるときの昇順と降順を切り替える

sorted 関数を使う場合も sort メソッドを使う場合もデフォルトでは昇順で並び替えが行われます。降順で並び替えをする場合は、次のように実行してください。

newlist = sorted(iterable, reverse=True)

引数に reverse=True を指定して sorted 関数を実行します。

具体的には次のように記述します。

mylist = ["C", "A", "B"]
newlist = sorted(mylist, reverse=True)

print(mylist)
--> ["C", "A", "B"]
print(newlist)
--> ["C", "B", "A"]
サンプルコード

次のサンプルを見てください。

colorlist = ["Blue", "Red", "Green", "White", "Black"]

upcolorlist = sorted(colorlist)
downcolorlist = sorted(colorlist, reverse=True)

print("Orig:", colorlist)
>> Orig: ['Blue', 'Red', 'Green', 'White', 'Black']
print("ASC: ", upcolorlist)
>> ASC:  ['Black', 'Blue', 'Green', 'Red', 'White']
print("DESC:", downcolorlist)
>> DESC: ['White', 'Red', 'Green', 'Blue', 'Black']

sorted 関数を使ってリストの要素を昇順と降順でそれぞれ並び替えることができました。

要素の値を他の関数に渡して帰ってきた値を使って並び替える

並び替えを行うときに、要素の値をそのまま使って比較するのではなく、一度指定した関数に要素の値を渡して帰ってきた値を使って比較するようにするには、次のように実行してください。

newlist = sorted(iterable, key=関数名)

指定できる関数は、 1 つの引数を取る関数を指定してください。

例えば絶対値を取ってから並び替えを行いたいのであれば、組み込み関数の abs 関数を指定します。

mylist = [5, -4, -7, 6]

sorted(mylist)
--> [-7, -4, 5, 6]

sorted(mylist, key=abs)
--> [-4, 5, 6, -7]

要素の値に対してそれぞれ絶対値を取った値を基準に並び替えを行います。

例えば文字列の長さを使って並び替えを行いたいのであれば、組み込み関数の len 関数を指定します。

mylist = ["apple", "pen", "desk", "banana"]

sorted(mylist)
--> ['apple', 'banana', 'desk', 'pen']

sorted(mylist, key=len)
--> ['pen', 'desk', 'apple', 'banana']

要素の値に対してそれぞれ文字の長さを取得し、長さを基準に並び替えを行います。

サンプルコード

次のサンプルを見てください。

animallist = ["Cat", "monkey", "bear", "Sheep", "cow"]

sortlist = sorted(animallist)
lowersortlist = sorted(animallist, key=str.lower)

print(animallist)
>> ['Cat', 'monkey', 'bear', 'Sheep', 'cow']
print(sortlist)
>> ['Cat', 'Sheep', 'bear', 'cow', 'monkey']
print(lowersortlist)
>> ['bear', 'Cat', 'cow', 'monkey', 'Sheep']

今回は引数に指定する関数として文字列型の str.lower() メソッドを指定しました。文字列をすべて小文字に変換した値を使って比較し並び替えを行っています。

-- --

作成済みのリストに含まれる要素を、要素の値を使って昇順または降順に並び替える方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。