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

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

新規登録して質問してみよう
ただいま回答率
85.35%
ソート

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

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

2693閲覧

Pythonで複数の配列を同時にソートしたい

fuji36_om

総合スコア8

ソート

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

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/09/10 00:05

前提・実現したいこと

Pythonで複数の配列を同時にソートしたい

発生している問題・エラーメッセージ

複数のリストをzipしてcというリストとし、
cというリストをソートしているつもりなのに、なぜかこのようなエラーが出ている。

AttributeError: 'zip' object has no attribute 'sort'

該当のソースコード

python

1from operator import itemgetter 2 3no = ['7', '10', '11', '5', '12', '2', '4', '9', '3', '8', '1', '6'] 4= ["渡邊","柳川","清野","根本","阿部","稲田","木内","三宅","石村","本郷","山田","清野"] 5= ["沙樹","和臣","菜緒","駿斗","亜依","和徳","喜雄","美南","比呂","香帆","比呂","菜緒",] 6性別 = ["女","男","女","男","女","男","男","女","男","女","男","女","男","女"] 7生年月日 =["1988/07/15","1966/09/04","1979/06/08","1992/03/14","1977/04/04","1963/11/06","1972/08/21","1992/11/30","1967/12/07","1965/03/20","1977/04/04","1992/11/30"] 8 9 10 11 12# zipで二つの配列を統合 13c = zip(no,,,性別 ,生年月日) 14 15c.sort(key=itemgetter(0)) 16 17# 統合していた配列をもとに戻す 18no,,,性別 ,生年月日 = zip(*c) 19 20print(no) 21print() 22print() 23print(性別) 24print(生年月日)

試したこと

以下の文献を参考に記述しました。

Pythonで複数の配列を同時にソート

python

1from operator import itemgetter 2 3a = ["a", "b", "c"] 4b = [2, 0, 1] 5 6 7c = zip(a, b) 8 9# itemgetterには何番目の配列をキーにしたいか渡します 10c.sort(key=itemgetter(1)) 11 12a, b = zip(*c) 13 14print(a) 15print(b) 16# ('b', 'c', 'a') 17# (0, 1, 2)

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

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

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

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

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

guest

回答3

0

python

1c = zip(no,,,性別 ,生年月日)

を次のようにしてみてください。

python

1c = list(zip(no,,,性別 ,生年月日))

zipはgeneratorを返すので、呼び出した時点ではリストなどを作成してくれないのです。

投稿2020/09/10 00:19

tachikoma

総合スコア3601

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

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

0

ベストアンサー

zipでsortは使えないというような記事も見かけました。
sortedなら大丈夫なようです。

python

1from operator import itemgetter 2 3no = ['7', '10', '11', '5', '12', '2', '4', '9', '3', '8', '1', '6'] 4= ["渡邊","柳川","清野","根本","阿部","稲田","木内","三宅","石村","本郷","山田","清野"] 5= ["沙樹","和臣","菜緒","駿斗","亜依","和徳","喜雄","美南","比呂","香帆","比呂","菜緒",] 6性別 = ["女","男","女","男","女","男","男","女","男","女","男","女","男","女"] 7生年月日 =["1988/07/15","1966/09/04","1979/06/08","1992/03/14","1977/04/04","1963/11/06","1972/08/21","1992/11/30","1967/12/07","1965/03/20","1977/04/04","1992/11/30"] 8 9 10# zipで二つの配列を統合 11c = zip(no,,,性別 ,生年月日) 12 13c = sorted(c, key=itemgetter(0)) 14 15# 統合していた配列をもとに戻す 16no,,,性別 ,生年月日 = zip(*c) 17 18print(no) 19print() 20print() 21print(性別) 22print(生年月日) 23''' 24('1', '10', '11', '12', '2', '3', '4', '5', '6', '7', '8', '9') 25('山田', '柳川', '清野', '阿部', '稲田', '石村', '木内', '根本', '清野', '渡邊', '本郷', '三宅') 26('比呂', '和臣', '菜緒', '亜依', '和徳', '比呂', '喜雄', '駿斗', '菜緒', '沙樹', '香帆', '美南') 27('男', '男', '女', '女', '男', '男', '男', '男', '女', '女', '女', '女') 28('1977/04/04', '1966/09/04', '1979/06/08', '1977/04/04', '1963/11/06', '1967/12/07', '1972/08/21', '1992/03/14', '1992/11/30', '1988/07/15', '1965/03/20', '1992/11/30') 29'''

追記
そういえば文字列順になってしまってますね。
itemgetterではなくlambdaで1つ目の配列の値をint型に変えた物をソート条件とすれば数値順に並びます。

python

1# zipで二つの配列を統合 2c = zip(no,,,性別 ,生年月日) 3 4c = sorted(c, key=lambda x: int(x[0])) 5 6# 統合していた配列をもとに戻す 7no,,,性別 ,生年月日 = zip(*c) 8 9print(no) 10print() 11print() 12print(性別) 13print(生年月日) 14''' 15('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12') 16('山田', '稲田', '石村', '木内', '根本', '清野', '渡邊', '本郷', '三宅', '柳川', '清野', '阿部') 17('比呂', '和徳', '比呂', '喜雄', '駿斗', '菜緒', '沙樹', '香帆', '美南', '和臣', '菜緒', '亜依') 18('男', '男', '男', '男', '男', '女', '女', '女', '女', '男', '女', '女') 19('1977/04/04', '1963/11/06', '1967/12/07', '1972/08/21', '1992/03/14', '1992/11/30', '1988/07/15', '1965/03/20', '1992/11/30', '1966/09/04', '1979/06/08', '1977/04/04') 20'''

投稿2020/09/10 00:17

編集2020/09/10 10:43
yureighost

総合スコア2183

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

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

fuji36_om

2020/09/10 09:56

1~10の順にする場合はどのようにすればよいのでしょうか
guest

0

最終的にはこのような方法にて解決しました。

python

1from operator import itemgetter 2 3no = ['7', '10', '11', '5', '12', '2', '4', '9', '3', '8', '1', '6'] 4= ["渡邊","柳川","清野","根本","阿部","稲田","木内","三宅","石村","本郷","山田","清野"] 5= ["沙樹","和臣","菜緒","駿斗","亜依","和徳","喜雄","美南","比呂","香帆","比呂","菜緒",] 6性別 = ["女","男","女","男","女","男","男","女","男","女","男","女","男","女"] 7生年月日 =["1988/07/15","1966/09/04","1979/06/08","1992/03/14","1977/04/04","1963/11/06","1972/08/21","1992/11/30","1967/12/07","1965/03/20","1977/04/04","1992/11/30"] 8 9def pri_all(): 10 print(no) 11 print() 12 print() 13 print(性別) 14 print(生年月日) 15 16def No_sort(): 17 global no 18 global19 global20 global 性別 21 global 生年月日 22 no = [int(s) for s in no] 23 comp = sorted(zip(no,,,性別 ,生年月日)) 24 no,,,性別 ,生年月日 = zip(*comp) 25 no = [str(s) for s in no] 26= [str(s) for s in] 27= [str(s) for s in] 28 性別 = [str(s) for s in 性別] 29 生年月日 = [str(s) for s in 生年月日] 30 31def Bir_sort(): 32 global no 33 global34 global35 global 性別 36 global 生年月日 37 comp = sorted(zip(生年月日,,,性別 ,no)) 38 生年月日,,,性別 ,no = zip(*comp) 39 no = [str(s) for s in no] 40= [str(s) for s in] 41= [str(s) for s in] 42 性別 = [str(s) for s in 性別] 43 生年月日 = [str(s) for s in 生年月日] 44 45 46def name_sort(): 47 global no 48 global49 global50 global 性別 51 global 生年月日 52 comp = sorted(zip(, 生年月日,,性別 ,no)) 53, 生年月日,,性別 ,no = zip(*comp) 54 no = [str(s) for s in no] 55= [str(s) for s in] 56= [str(s) for s in] 57 性別 = [str(s) for s in 性別] 58 生年月日 = [str(s) for s in 生年月日] 59 60

将来的には、GUIに組み込み、ソート機能として使えるようにする仕組みとする予定です。

投稿2020/09/16 23:49

fuji36_om

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問