タプルの要素を昇順または降順に並び替える

作成済みのタプルに含まれる要素を、要素の値を使って昇順または降順に並び替える方法について解説します。並び替えには sorted 関数を使用し、結果として取得したリストオブジェクトからタプルオブジェクトを作成します。

(Last modified: )

要素を並び替える

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

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

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

newlist = sorted(iterable)

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

引数にタプルを指定した場合も、並べ替えを行った後の結果としてリスト型のオブジェクトが返ってきます。その為、並べ替えた結果をタプルとして取得したい場合にはリスト型のオブジェクトからタプルを作成する必要があります。(リストからタプルを作成する方法について、詳しくは「文字列、リスト、rangeなどからタプルを作成する」を参照されてください)。

newtuple = tuple(newlist)

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

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

mytuple = ("C", "A", "B")

# 並べ替えを行う
newlist = sorted(mytuple)

# リストからタプルを作成する
newtuple = tuple(newlist)

print(mytuple)
>> ("C", "A", "B")
print(newtuple)
>> ("A", "B", "C")
サンプルコード

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

numtuple = (55, 78, 92, 82, 65)

newnumlist = sorted(numtuple)
newnumtuple = tuple(newnumlist)

print("Before:", numtuple)
>> Before: (55, 78, 92, 82, 65)
print("After: ", newnumtuple)
>> After:  (55, 65, 78, 82, 92)
animaltuple = ("Dog", "Cat", "Bear", "Deer")

newanimallist = sorted(animaltuple)
newanimaltuple = tuple(newanimallist)

print("Before:", animaltuple)
>> Before: ('Dog', 'Cat', 'Bear', 'Deer')
print("After: ", newanimaltuple)
>> After:  ('Bear', 'Cat', 'Deer', 'Dog')

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

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

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

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

numtuple = (5, 3.14, 4.78, 4)
newlist = sorted(numtuple)

print(tuple(newlist))
>> (3.14, 4, 4.78, 5)

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

mytuple = ("80", 75, 45, "68")
newlist = sorted(mytuple)

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

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

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

newlist = sorted(iterable, reverse=True)

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

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

mytuple = ("C", "A", "B")

# 並べ替えを行う
newlist = sorted(mytuple, reverse=True)

# リストからタプルを作成する
newtuple = tuple(newlist)

print(mytuple)
>> ("C", "A", "B")
print(newtuple)
>> ("C", "B", "A")
サンプルコード

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

colortuple = ("Blue", "Red", "Green", "White", "Black")

upcolortuple = tuple(sorted(colortuple))
downcolortuple = tuple(sorted(colortuple, reverse=True))

print("Orig:", colortuple)
>> Orig: ('Blue', 'Red', 'Green', 'White', 'Black')
print("ASC: ", upcolortuple)
>> ASC:  ('Black', 'Blue', 'Green', 'Red', 'White')
print("DESC:", downcolortuple)
>> DESC: ('White', 'Red', 'Green', 'Blue', 'Black')

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

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

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

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

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

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

mytuple = (5, -4, -7, 6)

tuple(sorted(mytuple))
>> (-7, -4, 5, 6)
tuple(sorted(mytuple, key=abs))
>> (-4, 5, 6, -7)

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

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

mytuple = ("apple", "pen", "desk", "banana")

tuple(sorted(mytuple))
>> ('apple', 'banana', 'desk', 'pen')
tuple(sorted(mytuple, key=len))
>> ('pen', 'desk', 'apple', 'banana')

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

サンプルコード

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

mytuple = ("C", "b", "A", "E", "d")

sorttuple = tuple(sorted(mytuple))
lowersorttuple = tuple(sorted(mytuple, key=str.lower))

print(mytuple)
>> ('C', 'b', 'A', 'E', 'd')
print(sorttuple)
>> ('A', 'C', 'E', 'b', 'd')
print(lowersorttuple)
>> ('A', 'b', 'C', 'd', 'E')

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

-- --

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

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。