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

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

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

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

Q&A

解決済

2回答

1713閲覧

ソート結果が正しくない

nocturne

総合スコア7

Python

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

0グッド

0クリップ

投稿2017/04/22 13:52

###前提・実現したいこと
csvファイルdata1.csvおよびそれと同じフォーマットのcsvファイルdata2.csv, csvファイルdata3.csvのそれぞれに対して,温度(1列目),抵抗率(2列目),電気抵抗(7列目),電気抵抗の測定誤差(8列目)を抜き出し,抵抗値の小さな行から大きな行の順にデータ行をsortし,ファイルに出力するscriptを作成する.ただし,抵抗値が負のデータに関しては,先頭に"##"を付けて出力する.

プログラムを作成し実行したところ以下のような出力ファイルができました。
抵抗値(3列目)を確認していただけると分かるかと思いますが
例)4行目 1.7095e-03
5行目 1.8408e-03
6行目 1.7739e-03
のように正しくソートした順にデータが並んでいません。何故なのでしょうか。
回答よろしくお願い致します。

###出力ファイル(output.txt)

78.27 2.2433e-07 1.3128e-03 4.6242e-07 78.44 2.2475e-07 1.3152e-03 5.2116e-07 86.45 2.8084e-07 1.6435e-03 4.2089e-07 87.55 2.9212e-07 1.7095e-03 4.4284e-07 90.82 3.1456e-07 1.8408e-03 2.2147e-07 89.14 3.0312e-07 1.7739e-03 1.2772e-06 90.50 3.1425e-07 1.8390e-03 2.6109e-06 90.92 3.1701e-07 1.8552e-03 4.3949e-07 89.72 3.1371e-07 1.8358e-03 1.5013e-06 91.88 3.1787e-07 1.8602e-03 1.2286e-05 92.31 3.2427e-07 1.8976e-03 1.7993e-07 92.94 3.2919e-07 1.9264e-03 2.8432e-06 93.46 3.3335e-07 1.9508e-03 4.0930e-07 94.26 3.3884e-07 1.9829e-03 3.8164e-07 94.50 3.3998e-07 1.9896e-03 2.9308e-07 94.68 3.4130e-07 1.9973e-03 1.8772e-06 95.85 3.5021e-07 2.0495e-03 4.1406e-06 97.43 3.6255e-07 2.1216e-03 2.1107e-07 97.73 3.6476e-07 2.1346e-03 5.0817e-07 98.56 3.6910e-07 2.1600e-03 4.3085e-07 102.25 3.9683e-07 2.3222e-03 1.7037e-07 105.50 4.2004e-07 2.4581e-03 2.6166e-07 110.53 4.5810e-07 2.6808e-03 2.3523e-07 115.53 4.9537e-07 2.8989e-03 5.5369e-07 120.38 5.1760e-07 3.0290e-03 5.5000e-06 125.50 5.7097e-07 3.3413e-03 3.1731e-07 129.53 6.0008e-07 3.5117e-03 1.7189e-06 135.40 6.4383e-07 3.7677e-03 4.4367e-07 140.26 6.7973e-07 3.9778e-03 7.9899e-07 148.37 7.3960e-07 4.3281e-03 6.5347e-07 156.15 7.9678e-07 4.6628e-03 2.2521e-06 164.15 8.5599e-07 5.0093e-03 5.3531e-07 172.26 9.1971e-07 5.3821e-03 4.3543e-06 180.39 9.7510e-07 5.7063e-03 6.9338e-07 186.24 1.0210e-06 5.9751e-03 2.3953e-07 196.17 1.0890e-06 6.3726e-03 5.5510e-07 204.14 1.1467e-06 6.7105e-03 5.2527e-07 211.83 1.2025e-06 7.0369e-03 7.4563e-07 220.06 1.2620e-06 7.3851e-03 1.2198e-06 228.02 1.3188e-06 7.7177e-03 8.5385e-07 236.13 1.3769e-06 8.0577e-03 6.1389e-07 243.94 1.4329e-06 8.3856e-03 8.7021e-07 251.97 1.4900e-06 8.7194e-03 9.4080e-07 259.53 1.5437e-06 9.0340e-03 8.0184e-07 267.57 1.6022e-06 9.3761e-03 6.1068e-07 276.04 1.6609e-06 9.7194e-03 1.6502e-06 283.99 1.7105e-06 1.0010e-02 2.9944e-06 78.40 8.0298e+02 1.1101e+04 5.2611e+03 78.32 8.0423e+02 1.1119e+04 3.3048e+03 86.17 4.0653e+02 5.6205e+03 6.9381e+04 87.07 3.3478e+02 4.6284e+03 8.4885e+03 91.03 2.2032e+02 3.0460e+03 5.2593e+02 89.59 2.2537e+02 3.1157e+03 7.0777e+03 89.69 2.7721e+02 3.8325e+03 3.4595e+04 91.08 2.1688e+02 2.9984e+03 2.7848e+03 90.98 2.1850e+02 3.0208e+03 6.7896e+03 91.40 2.2405e+02 3.0976e+03 1.2353e+04 92.22 1.9501e+02 2.6960e+03 8.1609e+02 92.60 1.8899e+02 2.6129e+03 6.1681e+02 93.28 1.7818e+02 2.4634e+03 9.1906e+02 94.12 1.6423e+02 2.2705e+03 1.4600e+03 94.51 1.5786e+02 2.1824e+03 1.9232e+02 94.62 1.5827e+02 2.1881e+03 1.3885e+03 95.15 1.6288e+02 2.2518e+03 4.4722e+03 97.38 1.2021e+02 1.6619e+03 2.9885e+02 97.56 1.1735e+02 1.6224e+03 3.4813e+02 98.19 1.1290e+02 1.5609e+03 3.4693e+02 101.69 8.4240e+01 1.1646e+03 7.0860e+02 104.74 6.5790e+01 9.0957e+02 3.4159e+02 109.73 4.4407e+01 6.1393e+02 1.3804e+02 114.72 3.0567e+01 4.2260e+02 7.1866e+01 119.36 2.2609e+01 3.1258e+02 1.6750e+01 124.82 1.5915e+01 2.2003e+02 1.8502e+01 128.85 1.2502e+01 1.7284e+02 1.9601e+00 134.51 9.2892e+00 1.2843e+02 4.0851e+00 139.25 7.3474e+00 1.0158e+02 2.3224e+00 147.15 5.1473e+00 7.1163e+01 1.5967e+00 154.81 3.7623e+00 5.2014e+01 6.1972e-01 162.97 2.8227e+00 3.9025e+01 3.4953e-01 170.84 2.2345e+00 3.0893e+01 2.7743e-01 178.99 1.7775e+00 2.4574e+01 1.4374e-01 186.39 1.4553e+00 2.0120e+01 2.8502e-02 194.50 1.2288e+00 1.6989e+01 6.6270e-02 202.49 1.0554e+00 1.4591e+01 4.9629e-02 209.95 9.3090e-01 1.2870e+01 3.2439e-02 218.07 8.2413e-01 1.1394e+01 3.0753e-02 226.23 7.3532e-01 1.0166e+01 1.9626e-02 234.30 6.6771e-01 9.2313e+00 1.4565e-02 241.97 6.1463e-01 8.4975e+00 1.1253e-02 250.09 5.7068e-01 7.8898e+00 8.6991e-03 257.84 5.3634e-01 7.4151e+00 6.5465e-03 266.00 5.0495e-01 6.9812e+00 4.6907e-03 274.34 4.7864e-01 6.6173e+00 2.8061e-03 282.51 4.5803e-01 6.3324e+00 3.7458e-03 78.35 8.4988e-07 5.2003e-06 1.4030e-06 ## 78.31 -4.7321e-06 -2.8955e-05 4.0052e-06 ## 86.32 -2.4543e-06 -1.5018e-05 8.5440e-06 87.32 8.7469e-06 5.3521e-05 1.8728e-06 90.91 1.1971e-05 7.3249e-05 9.3120e-07 89.32 1.2290e-05 7.5200e-05 3.6934e-06 90.03 1.5006e-05 9.1817e-05 1.2646e-06 ## 91.04 -9.4812e-06 -5.8014e-05 2.1003e-05 89.76 1.2979e-05 7.9414e-05 4.4758e-06 91.65 2.0989e-05 1.2843e-04 1.3700e-05 92.33 4.9946e-05 3.0561e-04 8.5386e-07 92.75 6.8950e-05 4.2190e-04 3.8610e-06 93.37 2.2276e-04 1.3630e-03 5.0790e-07 94.18 2.3378e-04 1.4305e-03 1.5380e-06 94.48 2.3744e-04 1.4529e-03 1.9513e-06 94.62 2.0868e-04 1.2769e-03 9.9065e-06 95.29 2.4723e-04 1.5128e-03 1.8584e-05 97.45 2.5083e-04 1.5348e-03 1.6598e-06 97.68 2.4950e-04 1.5267e-03 6.2054e-07 98.39 2.4606e-04 1.5056e-03 3.2587e-06 102.00 2.6751e-04 1.6369e-03 1.4422e-06 105.14 2.8102e-04 1.7195e-03 7.7957e-06 110.10 3.0117e-04 1.8428e-03 1.1915e-05 115.11 3.2225e-04 1.9718e-03 3.2484e-06 119.75 3.4881e-04 2.1343e-03 2.0617e-05 125.15 3.6479e-04 2.2321e-03 9.3778e-07 129.15 3.7386e-04 2.2876e-03 1.8753e-06 134.92 4.0593e-04 2.4838e-03 1.2696e-06 139.75 4.1951e-04 2.5669e-03 6.2759e-07 147.75 4.5178e-04 2.7644e-03 4.1930e-06 155.42 4.7606e-04 2.9129e-03 2.7603e-06 163.50 5.0517e-04 3.0911e-03 7.3491e-07 171.65 5.3828e-04 3.2937e-03 3.7993e-06 179.76 5.6113e-04 3.4335e-03 1.1255e-06 186.30 5.8351e-04 3.5704e-03 3.9036e-07 195.32 6.0834e-04 3.7224e-03 1.0203e-06 203.31 6.2953e-04 3.8520e-03 1.7085e-06 210.85 6.4588e-04 3.9521e-03 2.1140e-06 219.08 6.7698e-04 4.1423e-03 2.8030e-06 227.12 6.9838e-04 4.2733e-03 8.8692e-06 235.21 7.1719e-04 4.3884e-03 7.9470e-07 242.90 7.3836e-04 4.5180e-03 1.2676e-06 251.10 7.5852e-04 4.6413e-03 1.1781e-06 258.69 7.7807e-04 4.7609e-03 7.3464e-07 266.71 7.9811e-04 4.8835e-03 1.3722e-06 275.15 8.3132e-04 5.0867e-03 1.3586e-05 283.23 8.7133e-04 5.3316e-03 1.2972e-05

###該当のソースコード

Python

1#!/usr/bin/python 2# -*- coding: utf-8 -*- 3 4import re ## 正規表現用モジュール re のimport 5 6output="output.txt" 7FDO=open(output,'w') 8 9## 300行9列の2次元配列の初期化 10ni = 300 ## データ行数の上限 11nj = 9 ## 各行のデータ数 12array = [[0 for j in range(nj)] for i in range(ni)] 13nd = 0;## データ行数のカウンタ 14 15for j in range(0,3): 16 if(j==0): 17 input = "data1.csv" ## 入力ファイル名 18 if(j==1): 19 input ="data2.csv" 20 if(j==2): 21 input="data3.csv" 22 23 24 25### CSV データの2次元配列への格納 26 FDI = open( input,'r') ## 読み込みモードでファイルopen 27 28 for line in FDI: 29 if ( re.search(r'^#', line ) ): ## 行頭が # の場合 30 continue ## 次の行の処理へ 31 ## 各行の改行を除去 32 line = line.rstrip('\n') 33 line = line.rstrip('\r') 34 ## 各行をコンマで分割し,リストtmpへ代入 35 tmp = line.split(",") 36 for j in range(nj): ## float型に変換し、代入 37 array[nd][j] = float(tmp[j]) 38 nd += 1 39 FDI.close() ## ファイルを閉じる 40 41### 出力 42for i in range(0,nd): 43 for j in range(1,nd): 44 if(array[i][6]>array[j][6]): 45 tmp=[[0 for j in range(nj)]for i in range(1)] 46 tmp[0]=array[i] 47 array[i]=array[j] 48 array[j]=tmp[0] 49 50for i in range(nd): 51 T = array[i][0] ## 絶対温度 52 rho = array[i][1] ## 抵抗率 53 R = array[i][6] ## 電気抵抗 54 err = array[i][7] ## 電気抵抗の測定誤差 55 if ( R < 0 ): 56 print>>FDO,"##", 57 print>>FDO,"%7.2f %11.4e %11.4e %11.4e" % (T, rho, R, err) 58 59FDO.close() 60 61 62

###csvファイル(data1.csv)
リンク内容

###csvファイル(data2.csv)
リンク内容
###csvファイル(data3.csv)
リンク内容

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

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

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

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

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

guest

回答2

0

ベストアンサー

単純にソートのアルゴリズムが間違っております。

総当たりのソートの場合 i < j を成り立たせる必要があるので

Python

1### 出力 2for i in range(0,nd): 3 for j in range(1,nd): 4 if(array[i][6]>array[j][6]): 5 tmp=[[0 for j in range(nj)]for i in range(1)] 6 tmp[0]=array[i] 7 array[i]=array[j] 8 array[j]=tmp[0]

の部分は

Python

1### 出力 2for i in range(0,nd-1): # 0 ~ (N-1) に修正 3 for j in range(i,nd): # I ~ (N) に修正 4 if(array[i][6]>array[j][6]): 5 tmp=[[0 for j in range(nj)]for i in range(1)] 6 tmp[0]=array[i] 7 array[i]=array[j] 8 array[j]=tmp[0]

となります。
ちなみに

Python

1 tmp=[[0 for j in range(nj)]for i in range(1)] 2 tmp[0]=array[i] 3 array[i]=array[j] 4 array[j]=tmp[0]

の部分は

Python

1 tmp=array[i] 2 array[i]=array[j] 3 array[j]=tmp

と書け、さらにPythonでは

Python

1 array[i],array[j] = array[j],array[i]

と書くことができます。

さらにいうと、ソートアルゴリズム自体、Pythonに組み込みメソッドとしてありますので、

array.sort(key=lambda x: x[6])

の一行で済みます。

投稿2017/04/22 15:43

magichan

総合スコア15898

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

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

nocturne

2017/04/22 16:38

なるほど…、ソートそのもののが違っていましたか。 python自体にソートアルゴリズムがあることも初めて知りました。 丁寧な解説大変ありがとうございました。お陰様で助かりました。
guest

0

プログラミングの演習ではなく、研究・実験にプログラミングを使うという想定でコメントします。

今回のようなデータ解析には、ぜひ Numpy などのライブラリを活用してください。簡単・便利で、かつ非常に強力な機能を持っています。Numpy を使うとこんなに簡単に書くことができます。

python

1from __future__ import print_function 2import numpy as np 3 4# CSVの列名・フォーマットを指定 5dtype = [ 6 ('temp', float), 7 ('rho', float), 8 ('I_anode', float), 9 ('I_cathode', float), 10 ('V_anode', float), 11 ('V_cathode', float), 12 ('R', float), 13 ('errR', float), 14 ('Rprobe', float), 15] 16data1 = np.loadtxt('data1.csv', comments='##', delimiter=',', dtype=dtype) # CSV読み込み 17data2 = np.loadtxt('data2.csv', comments='##', delimiter=',', dtype=dtype) # CSV読み込み 18data3 = np.loadtxt('data3.csv', comments='##', delimiter=',', dtype=dtype) # CSV読み込み 19data = np.r_[data1, data2, data3] # 3つのデータを連結 20data.sort(order='R') # 抵抗値でソート 21 22output = "output.txt" 23FDO = open(output, 'w') 24for d in data: 25 print( 26 "%s%7.2f %11.4e %11.4e %11.4e" % 27 ('##' if d['R'] < 0 else '', d['temp'], d['rho'], d['R'], d['errR']), 28 file=FDO) 29FDO.close()

ご参考まで。

投稿2017/04/22 16:47

miyahan

総合スコア3095

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

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

nocturne

2017/04/22 17:22

なんと! 非常に簡潔になってますね。 pythonは初めて5日ほどなのでまだまだ浅い方を漂っている感じですがライブラリの活用…是非勉強しようと思います。 ありがとうございました、非常に参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問