質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1023閲覧

pythonにて、sortedを使用したときの並替順序の指定方法

hijiri

総合スコア61

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/09/07 01:05

python

1string = ["こ", "", "ろ", "あ", "", "さ"] 2num = ["20","","145","","3","79"] 3 4new_string = sorted(string) 5new_num = sorted(num) 6 7print(new_string) 8print(new_num)

上記コードを実行すると、

['', '', 'あ', 'こ', 'さ', 'ろ']
['', '', '145', '20', '3', '79']

という結果が得られます。

これを、
['あ', 'こ', 'さ', 'ろ', '', '']
['3', '20', '79', '145', '', '']

という並べ順にしたいと思っています。

sortedの引数に条件を指定すればいいのだとは思いますが、どのように指定すれば希望通りになるのかがよくわかっておりません。

このようなことは可能なのでしょうか?
可能であれば、どのようにすればよいのでしょうか?
どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

sortedの引数にkeyパラメーターを指定して、「比較を行う前にリストの各要素に対して呼び出される関数」を指定する。

  • 文字列の比較で""を末尾にするため、xが1文字以上ならその文字列自身を比較に使い、xが空文字列(やNone)のときには"\U0010FFFF"を比較に使う。

  • 数値が設定された文字列の比較で""を末尾にするため、xが1文字以上ならその文字列をintで整数にしたものを比較に使い(小数点以下を含むならfloatで浮動小数点数にすればいい)、xが空文字列(やNone)のときにはfloat('inf')(無限大)を比較に使う。

Python

1string = ["こ", "", "ろ", "あ", "", "さ"] 2num = ["20", "", "145", "", "3", "79"] 3 4new_string = sorted(string, key=lambda x: x if x else "\U0010FFFF") 5new_num = sorted(num, key=lambda x: int(x) if x else float('inf')) 6 7print(new_string) 8print(new_num)

result

1['あ', 'こ', 'さ', 'ろ', '', ''] 2['3', '20', '79', '145', '', '']

投稿2020/09/07 02:11

編集2020/09/07 02:14
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daregada

2020/09/07 02:15

タプルを使うほうがエレガントだった。
hijiri

2020/09/07 05:05

ありがとうございます。 こちらの回答のが、より明確でわかりやすかったので、ベストアンサーにさせていただきました!
guest

0

数値の方がちょっと面倒なことになってますが、
空文字かどうかの結果のbool型と元の値のtupleを作ることで順番通りに並ぶようにする方法です。

python

1string = ["こ", "", "ろ", "あ", "", "さ"] 2num = ["20","","145","","3","79"] 3 4new_string = sorted(string, key=lambda x: (x == "", x)) 5new_num = sorted(num, key=lambda x: (x == "", 0) if x == "" else (x == "", int(x))) 6 7print(new_string) 8# ['あ', 'こ', 'さ', 'ろ', '', ''] 9print(new_num) 10# ['3', '20', '79', '145', '', '']

投稿2020/09/07 01:54

編集2020/09/07 01:55
yureighost

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hijiri

2020/09/07 05:05

ありがとうございます。 希望通りの挙動になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問