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

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

ただいまの
回答率

89.99%

ソート結果が正しくない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,015

nocturne

score 5

前提・実現したいこと

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

該当のソースコード

#!/usr/bin/python
# -*- coding: utf-8 -*-

import re ## 正規表現用モジュール re のimport

output="output.txt"
FDO=open(output,'w')

## 300行9列の2次元配列の初期化 
ni = 300 ## データ行数の上限
nj =   9 ## 各行のデータ数
array = [[0 for j in range(nj)] for i in range(ni)]
nd = 0;## データ行数のカウンタ

for j in range(0,3):
    if(j==0):
        input  = "data1.csv"  ## 入力ファイル名
    if(j==1):
        input ="data2.csv"
    if(j==2):
        input="data3.csv"



### CSV データの2次元配列への格納
    FDI  = open( input,'r') ## 読み込みモードでファイルopen

    for line in FDI:
        if ( re.search(r'^#', line ) ): ## 行頭が # の場合
            continue  ## 次の行の処理へ
    ## 各行の改行を除去
        line = line.rstrip('\n')
        line = line.rstrip('\r')
    ## 各行をコンマで分割し,リストtmpへ代入
        tmp = line.split(",")
        for j in range(nj): ## float型に変換し、代入
            array[nd][j] = float(tmp[j])
        nd += 1
    FDI.close()  ## ファイルを閉じる

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

for i in range(nd):
    T   = array[i][0] ## 絶対温度
    rho = array[i][1] ## 抵抗率
    R   = array[i][6] ## 電気抵抗
    err = array[i][7] ## 電気抵抗の測定誤差
    if ( R < 0 ):
        print>>FDO,"##",
    print>>FDO,"%7.2f %11.4e %11.4e %11.4e" % (T, rho, R, err)

FDO.close()

csvファイル(data1.csv)

リンク内容

csvファイル(data2.csv)

リンク内容

csvファイル(data3.csv)

リンク内容

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+5

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

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

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

の部分は

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


となります。
ちなみに

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


の部分は

            tmp=array[i]
            array[i]=array[j]
            array[j]=tmp


と書け、さらにPythonでは

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


と書くことができます。

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

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


の一行で済みます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/23 01:38

    なるほど…、ソートそのもののが違っていましたか。
    python自体にソートアルゴリズムがあることも初めて知りました。

    丁寧な解説大変ありがとうございました。お陰様で助かりました。

    キャンセル

+1

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

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

from __future__ import print_function
import numpy as np

# CSVの列名・フォーマットを指定
dtype = [
    ('temp', float),
    ('rho', float),
    ('I_anode', float),
    ('I_cathode', float),
    ('V_anode', float),
    ('V_cathode', float),
    ('R', float),
    ('errR', float),
    ('Rprobe', float),
]
data1 = np.loadtxt('data1.csv', comments='##', delimiter=',', dtype=dtype)  # CSV読み込み
data2 = np.loadtxt('data2.csv', comments='##', delimiter=',', dtype=dtype)  # CSV読み込み
data3 = np.loadtxt('data3.csv', comments='##', delimiter=',', dtype=dtype)  # CSV読み込み
data = np.r_[data1, data2, data3]  # 3つのデータを連結
data.sort(order='R')  # 抵抗値でソート

output = "output.txt"
FDO = open(output, 'w')
for d in data:
    print(
        "%s%7.2f %11.4e %11.4e %11.4e" %
        ('##' if d['R'] < 0 else '', d['temp'], d['rho'], d['R'], d['errR']),
        file=FDO)
FDO.close()

ご参考まで。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/23 02:22

    なんと!
    非常に簡潔になってますね。

    pythonは初めて5日ほどなのでまだまだ浅い方を漂っている感じですがライブラリの活用…是非勉強しようと思います。

    ありがとうございました、非常に参考になりました。

    キャンセル

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

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる