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

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

新規登録して質問してみよう
ただいま回答率
85.46%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Python

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

Q&A

解決済

2回答

3865閲覧

3次元配列のソート方法

langhtorn

総合スコア104

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Python

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

0グッド

0クリップ

投稿2020/11/28 11:32

編集2020/11/28 14:26

###実現したいこと
3次元配列をリストwaruの値のついてソートしたいです。
めざしている実行結果は

waru=[3.0, 4.0, 6.0, 5.0, 2.0] ijkari=[[10, 21, 5, 30, 5], [30, 84, 30, 150, 10], [3.0, 4.0, 6.0, 5.0, 2.0]] ij=[[5, 10, 21, 30, 5], [10, 30, 84, 150, 30], [2.0, 3.0, 4.0, 5.0, 6.0]]

waruの中身が現在[3.0, 4.0, 6.0, 5.0, 2.0]なので同時にリストijkariの値を同時に並べ替えたい。

|pi|10|21|5|30|5|
|:--|:--:|--:|
|wi|30|84|30|150|10|
|waru|3|4|6|5|2|

から
|pi|5|10|21|30|5|
|:--|:--:|--:|
|wi|10|30|84|150|30|
|waru|2|3|4|5|6|

一番下のwaruに応じてpi,wiも並びが変わっているとういうような並べ替えをしたいです。

###問題点
waruの値でソートされていない。
求めている実行結果にする方法を教えてください。

5 10 21 30 5 10 30 84 150 30 waru= [3.0, 4.0, 6.0, 5.0, 2.0] ijkari= [[10, 21, 5, 30, 5], [30, 84, 30, 150, 10], [3.0, 4.0, 6.0, 5.0, 2.0]] ij= [[10, 21, 5, 30, 5], [3.0, 4.0, 6.0, 5.0, 2.0], [30, 84, 30, 150, 10]]

###コード

python

1from operator import itemgetter 2 3pi=[int(i) for i in input().split()] 4wi=[int(j) for j in input().split()] 5pin=len(pi) 6win=len(wi) 7 8waru=[] 9for i in range(pin): 10 w=wi[i]/pi[i] 11 waru.append(w) 12print("waru=",waru) #確かめ 13#pi,wiをwi/piについてソートする(3次元配列) 14ijkari=[] 15ijkari=[pi,wi,waru] 16print("ijkari=",ijkari) 17ij=sorted(ijkari,key=itemgetter(2)) 18print("ij=",ij)

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

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

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

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

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

meg_

2020/11/28 12:03

「waruの値のついてソートしたい」が分かりません。具体的な方法は何でしょうか?
meg_

2020/11/28 13:13

> waru=[3.0, 4.0, 6.0, 5.0, 2.0] > waru 3 4 6 5 0(ソート前) > waru 3 4 5 6 7(ソート後) リストwaruの中身が変わってしまっているのですが、タイプミスでしょうか? リストwaru自体は昇順の並び替えをしたい、ということで良いですか?
langhtorn

2020/11/28 14:26

そうです。タイプミスです。ご指摘ありがとうございます。
guest

回答2

0

ベストアンサー

下記処理ではijはfloatのnumpy配列となりますので、必要に応じてリストに変換する等処理してください。

python

1import numpy as np 2 3waru=[3.0, 4.0, 6.0, 5.0, 2.0] 4ijkari= [[10, 21, 5, 30, 5], [30, 84, 30, 150, 10], [3.0, 4.0, 6.0, 5.0, 2.0]] 5 6ij = np.array(ijkari)[:, np.argsort(waru)] 7print(ij) 8#array([[ 5., 10., 21., 30., 5.], 9# [ 10., 30., 84., 150., 30.], 10# [ 2., 3., 4., 5., 6.]])

投稿2020/11/28 13:26

meg_

総合スコア10607

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

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

langhtorn

2020/11/28 14:27

ありがとうございます。参考にさせていただきます。
guest

0

入力
waru=[3.0, 4.0, 6.0, 5.0, 2.0]
ijkari=[[10, 21, 5, 30, 5], [30, 84, 30, 150, 10], [3.0, 4.0, 6.0, 5.0, 2.0]]
出力
ij=[[5, 10, 21, 30, 5], [10, 30, 84, 150, 30], [2.0, 3.0, 4.0, 5.0, 6.0]]
の理解で、そして ijkari の一要素が waru の前提でのコードです。

Python

1waru= [3.0, 4.0, 6.0, 5.0, 2.0] 2ijkari= [[10, 21, 5, 30, 5], [30, 84, 30, 150, 10], [3.0, 4.0, 6.0, 5.0, 2.0]] 3 4def index_sort(slst, klst): 5 try: 6 idx = slst.index(klst) 7 except ValueError as e: 8 print(f'ValueError: {e}') 9 return 10 tmp = list(map(list, zip(*slst))) 11 tmp = sorted(tmp, key=lambda x:x[idx]) 12 return list(map(list, zip(*tmp))) 13 14ij = index_sort(ijkari, waru) 15print(ij) # [[5, 10, 21, 30, 5], [10, 30, 84, 150, 30], [2.0, 3.0, 4.0, 5.0, 6.0]]

投稿2020/11/28 13:14

lehshell

総合スコア1147

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

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

langhtorn

2020/11/28 14:28

ありがとうございます。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問