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

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

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

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

Q&A

解決済

2回答

305閲覧

辞書型のリストを変数の数字順に並べ替えたい

MOSMOS2

総合スコア20

Python

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

0グッド

0クリップ

投稿2018/09/16 04:35

以下のように、辞書型に格納した変数があります。
これを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ページで確認できます。

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

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

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

guest

回答2

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]

  

上記のコードは以下にて動作確認することができます。


追記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 を使っておくのが無難かなと思いました。
以下、そのコードになります。


追記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
jun68ykt

総合スコア9058

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

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

MOSMOS2

2018/09/16 06:08 編集

ありがとうございます。例えば、これを 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]} の形式が保管されるように、並べ替えたいと考えております。勉強不足で申し訳ありません。
jun68ykt

2018/09/16 06:41

@MOSMOS2さん コメントありがとうございます。回答のほうに追記として返答しました。
jun68ykt

2018/09/16 07:05 編集

分かりやすく、ざっくり言うと、ソースコードに辞書の初期化を d = { 'a': 1, 'b': 2, 'c': 3 } と書いたからといって、 d には「キーの順序が 'a', 'b', 'c' である」という情報が含まれている、とは必ずしもいえない。 ということですね。 たとえば、MacOSのターミナルから、ちょっと昔のPython を使って確認してみたログが以下です。(MacOSのバージョンは10.13.6) =============================== [jun68ykt@macmini ~]$ date 2018年 9月16日 日曜日 16時00分02秒 JST [jun68ykt@macmini ~]$ python -V Python 2.7.10 [jun68ykt@macmini ~]$ python Python 2.7.10 (default, Oct 6 2017, 22:29:07) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> d = { 'a': 1, 'b': 2, 'c': 3 } >>> print(d) {'a': 1, 'c': 3, 'b': 2} >>> =============================== 上記のように、 print(d) としたときに {'a': 1, 'c': 3, 'b': 2} と表示されました。
jun68ykt

2018/09/16 07:43

連投コメントすみません。 Python 3.7 では、通常の dict でもエントリの追加順に,キーの順序を保存してくれるようになったようですので、これを使ったコードを回答の追記2に記載しました。
MOSMOS2

2018/09/16 10:36

ご丁寧にありがとうございます。そうなんです。辞書の順序と自分の元々のarrayとかから引っ張ってきた順序が自動更新されて困っています。私のpythonは3.6.2なので、 data_dic = { "variable{}".format(i + 1): [x for x in row if not np.isnan(x)] ordered_data = OrderedDict(sorted(data_dic.items(), key=lambda x: int(x[0].replace('variable', '')))) print(ordered_data) pprint.pprint(ordered_data) for i, row in enumerate(data)} pprint.pprint(data_dic) で出力すると、下記のように、順番どおりにはなって嬉しいのですが、上記のdata2のようにはなっていません。ですが、表記の順番は思っているのと違くても、実際のvarible1, 2, ...の数字には該当する数字がそれぞれ格納されているので、このまま進めようかなとも思っています。 OrderedDict([('variable1', [0.0, 25.0, 50.0, 75.0]), ('variable2', [0.0]), ('variable3', [0.0, 30.0, 90.0, 60.0]), ('variable4', [0.0, 150.0, 235.0]), ('variable5', [50.0, 100.0, 200.0, 400.0, 600.0]), ('variable6', [0.0]), ('variable7', [0.0, 250.0, 350.0, 400.0, 600.0]), ('variable8', [20.0, 50.0, 100.0, 200.0]), ('variable9', [0.0, 100.0, 200.0, 300.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]), .... ちなみに、AnacondaでUpdateしてもPython3.7にはならないのですね。 色々勉強になりました。
jun68ykt

2018/09/16 11:02

なるほどですね。最後にお節介をもう一つさせて頂くと、 import json しておいて、 ordered_data = OrderedDict(sorted(data.items(), key=lambda x: int(x[0].replace('variable', '')))) で作成した ordered_data を、以下 print(json.dumps(ordered_data, indent=4)) のようにJSONとしてダンプすると、お求めになっている形に近いフォーマットで出力されるかもしれません。
jun68ykt

2018/09/16 11:09

とはいえ、プログラムであれこれやって出力を整形するよりは 3.7 に上げられるのでしたら、そのほうがベターかもですね。
MOSMOS2

2018/09/16 11:53

コメントありがとうございます。jsonでやってみたら、下記のようになりました。順番通りではありますね。これはこれで面白く、大変参考になりました。また何かあれば、よろしくお願いいたします。 { "variable1": [ 0.0, 25.0, 50.0, 75.0 ], "variable2": [ 0.0 ], "variable3": [ 0.0, 30.0, 90.0, 60.0 ], "variable4": [ 0.0, 150.0, 235.0 ], ...
guest

0

この例題に限らず普段からkeyをナンバリングする時に必要な桁だけ0埋めすればソートが楽ですよ。
variable001
variable002
variable003
variable012
variable023
variable099
variable123
variable234
variable999

投稿2018/09/16 08:40

opyon

総合スコア1009

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

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

MOSMOS2

2018/09/16 10:26

ありがとうございます。参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問