はじめに
Pythonで競プロをやっていると文字列のソートが意外とややこしいことに気付いたので、今回は文字列のソートの基本をまとめます。AtCoderのPython3.4.3と3.8で動作確認済みです。
一つの文字列
文字列をs
としたとき,sorted(s)
で1文字ずつソートされたリストが返ってきます。
入力
bcaed
Python
s = sorted(input())
print(s)
出力
['a', 'b', 'c', 'd', 'e']
文字列のリスト (1次元)
文字列のリストをstr_list
としたとき,str_list.sort()
かsorted(str_list)
でソートされたリストが返ってきます。
入力
az aj ab aa bc ad
Python
str_list = sorted(list(input().split()))
print(str_list)
出力
['aa', 'ab', 'ad', 'aj', 'az', 'bc']
文字列のリスト (2次元)
入力
3
az aj
ab aa
bc ad
Python
n = int(input()) #nは入力回数
str_list = [list(input().split()) for _ in range(n)]
print(sorted(sorted(str_list)))
出力
[['ab', 'aa'], ['az', 'aj'], ['bc', 'ad']]
素直にsortすると各リストの先頭要素をkeyとしてsortしていることが分かります。
では先頭以外の要素でソートしようとすると、以下のようになります。
Python
n = int(input()) # nは入力回数
str_list = [list(input().split()) for _ in range(n)]
print(sorted(str_list,key=lambda x:x[1])) # 2番目の要素でソート
出力
[['ab', 'aa'], ['bc', 'ad'], ['az', 'aj']]
降順ソート
降順にソートしたいときは、reverse==True
をsorted()
のカッコ内に書き加えてください。
入力
az aj ab aa bc ad
Python
str_list = sorted(list(input().split()), reverse=True)
print(str_list)
出力
['bc', 'az', 'aj', 'ad', 'ab', 'aa']
さいごに
読んでいただきありがとうございました。指摘等ございましたらコメントお願いします。