以下のように、辞書型に格納した変数があります。
これをvariable1-->2-->...-->20-->31の順番に並べ替えたいのですが、sortedなどを使っても、結局この順番になってしまいます。何か解決方法をご提示いただければ幸いです。
{'variable1': [0.0, 25.0, 50.0, 75.0],
'variable10': [0.0, 50.0, 100.0, 150.0],
'variable11': [0.0],
'variable12': [0.0, 30.0, 50.0, 70.0, 100.0],
'variable13': [0.0],
'variable14': [0.0],
'variable15': [0.0],
'variable16': [0.0],
'variable17': [0.0],
'variable18': [0.0],
'variable19': [0.0, 0.0, 100.0, 200.0, 300.0],
'variable2': [0.0],
'variable20': [0.0],
'variable21': [10.0, 20.0],
'variable22': [70.0, 100.0, 150.0, 200.0, 250.0],
'variable23': [5.0],
'variable24': [30.0, 60.0, 90.0, 150.0],
'variable25': [0.0, 70.0, 100.0, 120.0],
'variable26': [0.0, 30.0],
'variable27': [0.0, 8.0, 10.0, 12.0, 18.0],
'variable28': [0.0, 8.0, 10.0, 12.0, 18.0],
'variable29': [0.0, 6.0, 9.0, 11.0, 18.0],
'variable3': [0.0, 30.0, 90.0, 60.0],
'variable30': [0.0],
'variable31': [0.0]}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答2件
0
この例題に限らず普段からkeyをナンバリングする時に必要な桁だけ0埋めすればソートが楽ですよ。
variable001
variable002
variable003
variable012
variable023
variable099
variable123
variable234
variable999
投稿2018/09/16 08:40
総合スコア1009
0
ベストアンサー
こんにちは。
以下のドキュメント
にあるとおり、sorted を使う際のソートキーとして、もともとのデータのある部分だけをキーとして使ったり、加工したものをキーとして使うように指定することができます。
このご質問の場合は、文字列'variableN' から得られる整数 Nをソートキーに使うように指定すればよいので、たとえば以下のようにすればよいかと思います。
python
1data = { 2 'variable1': [0.0, 25.0, 50.0, 75.0], 3 'variable10': [0.0, 50.0, 100.0, 150.0], 4 'variable11': [0.0], 5 'variable12': [0.0, 30.0, 50.0, 70.0, 100.0], 6 'variable13': [0.0], 7 'variable14': [0.0], 8 'variable15': [0.0], 9 'variable16': [0.0], 10 'variable17': [0.0], 11 'variable18': [0.0], 12 'variable19': [0.0, 0.0, 100.0, 200.0, 300.0], 13 'variable2': [0.0], 14 'variable20': [0.0], 15 'variable21': [10.0, 20.0], 16 'variable22': [70.0, 100.0, 150.0, 200.0, 250.0], 17 'variable23': [5.0], 18 'variable24': [30.0, 60.0, 90.0, 150.0], 19 'variable25': [0.0, 70.0, 100.0, 120.0], 20 'variable26': [0.0, 30.0], 21 'variable27': [0.0, 8.0, 10.0, 12.0, 18.0], 22 'variable28': [0.0, 8.0, 10.0, 12.0, 18.0], 23 'variable29': [0.0, 6.0, 9.0, 11.0, 18.0], 24 'variable3': [0.0, 30.0, 90.0, 60.0], 25 'variable30': [0.0], 26 'variable31': [0.0] 27} 28 29for k, v in sorted(data.items(), key=lambda x: int(x[0].replace('variable', ''))): 30 print(k + ": " + str(v))
上記を実行すると、以下が表示されます。
shell
1variable1: [0.0, 25.0, 50.0, 75.0] 2variable2: [0.0] 3variable3: [0.0, 30.0, 90.0, 60.0] 4variable10: [0.0, 50.0, 100.0, 150.0] 5variable11: [0.0] 6variable12: [0.0, 30.0, 50.0, 70.0, 100.0] 7variable13: [0.0] 8variable14: [0.0] 9variable15: [0.0] 10variable16: [0.0] 11variable17: [0.0] 12variable18: [0.0] 13variable19: [0.0, 0.0, 100.0, 200.0, 300.0] 14variable20: [0.0] 15variable21: [10.0, 20.0] 16variable22: [70.0, 100.0, 150.0, 200.0, 250.0] 17variable23: [5.0] 18variable24: [30.0, 60.0, 90.0, 150.0] 19variable25: [0.0, 70.0, 100.0, 120.0] 20variable26: [0.0, 30.0] 21variable27: [0.0, 8.0, 10.0, 12.0, 18.0] 22variable28: [0.0, 8.0, 10.0, 12.0, 18.0] 23variable29: [0.0, 6.0, 9.0, 11.0, 18.0] 24variable30: [0.0] 25variable31: [0.0]
上記のコードは以下にて動作確認することができます。
- 動作確認のためのサンプルコード: https://trinket.io/python/c5f7b9d7cf
追記1
コメントから頂きました
MOSMOS2 2018/09/16 15:07 ありがとうございます。例えば、これを data2 = { 'variable1': [0.0, 25.0, 50.0, 75.0], 'variable2': [0.0], 'variable3': [0.0, 30.0, 90.0, 60.0], 'variable10': [0.0, 50.0, 100.0, 150.0], 'variable11': [0.0], 'variable12': [0.0, 30.0, 50.0, 70.0, 100.0], 'variable13': [0.0], 'variable14': [0.0], 'variable15': [0.0], 'variable16': [0.0], 'variable17': [0.0], 'variable18': [0.0], 'variable19': [0.0, 0.0, 100.0, 200.0, 300.0], 'variable20': [0.0], 'variable21': [10.0, 20.0], 'variable22': [70.0, 100.0, 150.0, 200.0, 250.0], 'variable23': [5.0], 'variable24': [30.0, 60.0, 90.0, 150.0], 'variable25': [0.0, 70.0, 100.0, 120.0], 'variable26': [0.0, 30.0], 'variable27': [0.0, 8.0, 10.0, 12.0, 18.0], 'variable28': [0.0, 8.0, 10.0, 12.0, 18.0], 'variable29': [0.0, 6.0, 9.0, 11.0, 18.0], 'variable30': [0.0], 'variable31': [0.0] } の形式が保管されるように、並べ替えたいと考えております。勉強不足で申し訳ありません。
に返答するために、あらためて詳細に踏み込んだ shimizukawa さんのご質問
とその回答を拝読したうえで、 OrderedDict を使っておくのが無難かなと思いました。
以下、そのコードになります。
- OrderedDictを使って順序つきキーの辞書を作成: https://trinket.io/python/13d9e0c27c
追記2
Python 3.7.0 ドキュメント - 4.10. マッピング型
の中に
バージョン 3.7 で変更: 辞書の順序が挿入順序であることが保証されるようになりました。この振る舞いは CPython 3.6 の実装詳細でした。
との一文がありました。ですので、 Python 3.7 を使うのであれば、以下のように書くことで、キーの順序が保持された dict である data2 を作成することができます。
python
1data = { 2 'variable1': [0.0, 25.0, 50.0, 75.0], 3 'variable10': [0.0, 50.0, 100.0, 150.0], 4 'variable11': [0.0], 5 'variable12': [0.0, 30.0, 50.0, 70.0, 100.0], 6 'variable13': [0.0], 7 'variable14': [0.0], 8 'variable15': [0.0], 9 'variable16': [0.0], 10 'variable17': [0.0], 11 'variable18': [0.0], 12 'variable19': [0.0, 0.0, 100.0, 200.0, 300.0], 13 'variable2': [0.0], 14 'variable20': [0.0], 15 'variable21': [10.0, 20.0], 16 'variable22': [70.0, 100.0, 150.0, 200.0, 250.0], 17 'variable23': [5.0], 18 'variable24': [30.0, 60.0, 90.0, 150.0], 19 'variable25': [0.0, 70.0, 100.0, 120.0], 20 'variable26': [0.0, 30.0], 21 'variable27': [0.0, 8.0, 10.0, 12.0, 18.0], 22 'variable28': [0.0, 8.0, 10.0, 12.0, 18.0], 23 'variable29': [0.0, 6.0, 9.0, 11.0, 18.0], 24 'variable3': [0.0, 30.0, 90.0, 60.0], 25 'variable30': [0.0], 26 'variable31': [0.0] 27} 28 29data2 = dict() 30 31for k, v in sorted(data.items(), key=lambda x: int(x[0].replace('variable', ''))): 32 data2[k] = v 33
上記を勘案して言えることは、MOSMOS2さんがお使いの Pythonが、バージョン 3.7 より古いものでしたら、やはりOrderedDict を使っておくのが無難、ということになるかなと思います。自学自習で使う環境(たとえば自分の私物のPCなど)でしたら、Pythonをバージョンアップすることは自由にできますが、業務で何らかの本番環境のためのコードを書いていると、本番環境の言語処理系が必ずしも最新のものではない、ということはよくあることですので、ご自身の環境の要件に合わせて、Python 3.7 による新しい機能を使うか、もしくは OrderedDict を使うかを判断されるとよいかと思います。
投稿2018/09/16 05:05
編集2018/09/16 10:28総合スコア9058
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
2018/09/16 10:26