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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2277閲覧

3次元リストのsort

bof

総合スコア18

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/08/21 12:17

編集2017/08/21 13:56

python

list= [[[0.8, 太郎, 次郎], [0.7, 三郎, 明]] [[0.6, 花子, 咲良], [0.9, 太郎, 翔]]]

このような3次元のリスト(三郎 = list[0][1][1]となる)を昇順にするにはどうしたらよいでしょか?
昇順にソート後

list = [[[0.6, 花子, 咲良], [0.7, 三郎, 明]] [[0.8, 太郎, 次郎], [0.9, 太郎, 翔]]]
list = list.sort(key = lambda x:x[0])

をすると下記のエラーが出ました。

TypeError: Argument given by name ('key') and position (1)

3次元listの場合sortをどのように用いればよいのでしょうか?教えていただければ幸いです。

rat_lav = [] for i in range(84): tmp = [] for j in range(84): matcher = matching_hist(histtest[i:i+1, 0:], histrain[j:j+1, 0:]) matcher = float(matcher) tmp.append([matcher, i, j]) rat_lav.append(tmp) ``` で3次元となったrat_lavをmatcherで昇順にする方法がわからず質問させていただきました。

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

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

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

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

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

quickquip

2017/08/21 15:31

3次元でのソートということですが欲しい結果が分からないのですよね。[[[4, 'c'], [6, 'd']], [[7, 'b'], [4, 'a']], [[5, 'e'], [3, 'f']]] を元として欲しい結果はなんなのでしょうか?? [[[3, 'f'], [5, 'e']], [[4, 'a'], [7, 'b']], [[4, 'c'], [6, 'd']]] なのでしょうか? それとも別の結果?
bof

2017/08/21 15:50

結果として[[[3, 'f'], [4, 'a']], [[4, 'c'], [5, 'e']], [[6, 'd'] ,[7, 'b']]]を得たいです
quickquip

2017/08/21 16:09

なるほど。LouiS0616さんの回答が正しくて「2個ずつになっている理由がない」のですね。タブに開いている間に解決済みになっていたようで、余計なコメントをしてしまいました。すみません。
guest

回答1

0

ベストアンサー

どのような理由で2個ずつ要素を束ねているかわかりません。
入れ子を減らしてソートすればよいのでは?

Python

1def main(): 2 my_list = [[[0.8, '太郎', '次郎'], [0.7, '三郎', '明']], [[0.6, '花子', '咲良'], [0.9, '太郎', '翔']]] 3 my_list = [inner for outer in my_list for inner in outer] 4 my_list.sort() 5 6 print(my_list) 7 8if __name__ == '__main__': 9 main() 10 11"""実行結果 12[[0.6, '花子', '咲良'], [0.7, '三郎', '明'], [0.8, '太郎', '次郎'], [0.9, '太郎', '翔']] 13"""

ご提示の出力イメージのように、二つずつ束ねるのなら。

Python

1def bundle_list(src_list, num): 2 ret_list = [] 3 4 tmp_list = [] 5 for i, elem in enumerate(src_list): 6 tmp_list.append(elem) 7 if i % num == num-1: 8 ret_list.append(tmp_list) 9 tmp_list = [] 10 11 return ret_list

適当に関数を組んでみました。もっといい方法がある気もします。


注意
変数などの命名をする場合、組み込みの名前と重複しないように気を付けてください。
listではなく、tmp_list my_listなどを用いてください。
発見しづらいエラーの原因となります。


抽象化してみた。

Python

1def debundle_list(src_list): 2 ret_list = [] 3 4 def debundle(src): 5 if isinstance(src, list): 6 for elem in src: 7 debundle(elem) 8 else: 9 ret_list.append(src) 10 11 debundle(src_list) 12 return ret_list 13 14def bundle_list(src_list, num): 15 ret_list = [] 16 17 tmp_list = [] 18 for i, elem in enumerate(src_list): 19 tmp_list.append(elem) 20 if i % num == num-1: 21 ret_list.append(tmp_list) 22 tmp_list = [] 23 24 return ret_list 25 26def main(): 27 my_list = [[[0.8, '太郎', '次郎'], [0.7, '三郎', '明']], [[0.6, '花子', '咲良'], [0.9, '太郎', '翔']]] 28 my_list = bundle_list(debundle_list(my_list), 3) 29 my_list.sort() 30 31 my_list = bundle_list(my_list, 2) 32 print(my_list) 33 34if __name__ == '__main__': 35 main()

投稿2017/08/21 13:36

編集2017/08/21 13:44
LouiS0616

総合スコア35660

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

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

bof

2017/08/21 13:59

すいません。この質問は先ほどした質問「for文の作り方」の続きに当たる質問になってしまったのですが、rat_lav[i][83-k][0]を昇順にする方法は入れ子構造を解く以外にないでしょうか?sort(key=lambda)みたいなのでやれると嬉しかったりします
LouiS0616

2017/08/21 14:12

確信度の高い順(or 低い順)にソートしたいということでしょうか? もともとリストの順に意味を持たせていますから(そうですよね?)、単にソートすることは出来てもあまり意味はないかと思います。
LouiS0616

2017/08/21 14:13

どうしてもしたい場合は、リストの要素を書き換えてやる必要があるかと。
bof

2017/08/21 14:17

確信度の低い順にソートしたいということです。リストの要素を書き換えるとは,バブルソートみたいなイメージですか?
LouiS0616

2017/08/21 14:19

いえ、具体的なソートの方法ということではなく... rat_lav[i][j] で要素elemを参照するところを、 new_rat_lav で(elem, i, j)を参照するように書き換えればよいのかな、ということです。
bof

2017/08/21 14:21 編集

2次元リストのソートはsort(key=lambda x:x[0])でできると思うのですが、このようのことを3次元のret_lav[i][j][k]でもできませんか?
LouiS0616

2017/08/21 14:21

iとかjとかの情報は失われてもいいんですか? それなら低次元にリストを潰した方がよいかと。
bof

2017/08/21 14:24

2次元のリストでsort(key=lambda x:x[0])をするときは、x[][1]とx[][2]は情報を失われないと思うのですが、トンチンカンなこと言ってますかね?
LouiS0616

2017/08/21 14:35

生徒の点数と評定を、クラスとidでリストにするとします。 result = [[[70, 'B'], [50, 'C']], [[20, 'E'], [90, 'A']]] # 内容は即興です。 0クラスのid0の人の点数は、result[0][0][0]で参照できますね。 こいつを一番内側の要素でソートすると、こうなります。 [[[20, 'E'], [50, 'C']], [[70, 'B'], [90, 'A']]] こうなってしまうと、もはや『クラス』『id』の情報は失われます。 それなら、 [[20, 'E'], [50, 'C'], [70, 'B'], [90, 'A']] こういう風に書いた方が簡潔なんじゃないか? 私が言っているのはこういうことです。
bof

2017/08/21 14:42

おっしゃりたいことは理解いたしました。ご教授ありがとうございます
bof

2017/08/21 14:50 編集

すいません。ちなみになのですが、2次元リストのソートはsort(key=lambda x:x[0])でできると思うのですが、このようのことを3次元のリストでもできませんか?可能であれば方法を教えていただくことはできますか?3次元においての例がウェブでは見つからなかったので
bof

2017/08/21 15:09

そうです。何回も検索して何回もたどり着きました
LouiS0616

2017/08/21 15:13

これは、多重リストのソートではなく、多重キーでのソートです。 リストの要素がリスト/タプルである場合、各要素のどれを比べるか、という話題です。
LouiS0616

2017/08/21 15:14

先入観をなくしてじっくり読んでみてください。
bof

2017/08/21 15:19

了解いたしました。じっくり読んでもわからなかった場合はまた別に質問させていただきます。長く低レベルな質問に丁寧に答えて頂きありがとうございました。
LouiS0616

2017/08/21 15:22

いえいえ、私自身もある程度楽しんで回答しています。 ですから、低レベルだなんて謙遜/卑下しなくていいですよ。誰でも最初は初心者です。
bof

2017/08/21 15:25

ありがとうございます。今後ともわからないことがあったら、よろしくお願いたします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問