2017-07-01 28 views
0

私はpythonのnoobと私は問題に立ち往生しています。Pythonのファイル処理

filehandler = open("data.txt", "r")              

alist = filehandler.readlines()               

def insertionSort(alist):                 

    for line in alist:                  

     line = list(map(int, line.split()))            
     print(line)                  

     for index in range(2, len(line)):             

     currentvalue = line[index]              
     position = index                 


     while position>1 and line[position-1]>currentvalue:        
      line[position]=line[position-1]            
      position = position-1               

     line[position]=currentvalue              

     print(line)                  

insertionSort(alist)                  


for line in alist:                   
    print line 

出力:

[4, 19, 2, 5, 11] 
[4, 2, 5, 11, 19] 
[8, 1, 2, 3, 4, 5, 6, 1, 2] 
[8, 1, 1, 2, 2, 3, 4, 5, 6] 
4 19 2 5 11 

8 1 2 3 4 5 6 1 2 

私は、ファイルから値の行を並べ替えることになっています。行の最初の値はソートされる値の数を表します。私は並べ替えられた順序でファイルの値を表示するはずです。

insertionSortのプリント呼び出しは、デバッグの目的にすぎません。

出力の上位4行は、挿入ソートが機能しているようです。 insertSortを呼び出した後にリストを印刷すると、値がソートされない理由を理解できません。

私はスタックオーバーフローとPythonの新機能ですので、この質問が間違っている場合はお知らせください。

+0

を私はあなたの問題を理解している場合、ファイル内の行が変更されなかった理由を迷っていますか?ファイル内の値を並べ替えることを意味しますか?私は少し混乱してごめんなさい、もう少し説明してみてください –

+2

あなたはラインを分割することから作成するリストをソートしています。あなたがこれをするとき、あなたは 'line'や' alist'を変更していません。 – Barmar

+0

これはhw質問ですか?そうでない場合は、常に 'sorted'関数を使用することができます – Alter

答えて

0
for line in alist:                  
    line = list(map(int, line.split())) 

line例えば"4 19 2 5 11"として始まります。分割してintに変換すると、つまり[4, 19, 2, 5, 11]になります。

次に、この新しい値をlistに割り当てます。ただし、listはローカル変数です。新しい値は決してalistに格納されません。

listまた、すでにlistというデータ型があります(変数名により、データ型を使用できなくなります)ので、listはひどい変数名です。

のは、あなたのプログラムを再編成してみましょう:

def load_file(fname): 
    with open(fname) as inf: 
     # -> list of list of int 
     data = [[int(i) for i in line.split()] for line in inf] 
    return data 

def insertion_sort(row): 
    # `row` is a list of int 
    # 
    # your sorting code goes here 
    # 
    return row 

def save_file(fname, data): 
    with open(fname, "w") as outf: 
     # list of list of int -> list of str 
     lines = [" ".join(str(i) for i in row) for row in data] 
     outf.write("\n".join(lines)) 

def main(): 
    data = load_file("data.txt") 
    data = [insertion_sort(row) for row in data] 
    save_file("sorted_data.txt", data) 

if __name__ == "__main__": 
    main() 

実際には、あなたのデータで - 各行の最初の数は、データをソートするために、実際にはない場合 - あなたは

data = [row[:1] + insertion_sort(row[1:]) for row in data] 

を行う方が良いでしょうinsertion_sortのロジックがより洗練されているようにします。

+0

noobについては、マップを実行していることを説明していないと、おそらく他の誰かがそれらをコーディングするのを探していない限り、 – whieronymus

+0

マップとは何かを理解しています。私はまだ大騒ぎだと言っている。今日初めてPythonを見ても。 – benpaul

0

上記の@Barmarは、関数への入力を変更していません。 、

def insertionSort(alist): 
    blist = [] 

    for line in alist: 
     line = list(map(int, line.split())) 

     for index in range(2, len(line)): 
      currentvalue = line[index] 
      position = index 

      while position>1 and line[position-1]>currentvalue: 
       line[position]=line[position-1] 
       position = position-1 

      line[position]=currentvalue 

     blist.append(line) 

    return blist 

blist = insertionSort(alist) 
print(blist) 

また、「インプレース」alistを変更します:あなたは、次の操作を行うことができ

def insertionSort(alist): 
    for k, line in enumerate(alist): 
     line = list(map(int, line.split())) 

     for index in range(2, len(line)): 
      currentvalue = line[index] 
      position = index 

      while position>1 and line[position-1]>currentvalue: 
       line[position]=line[position-1] 
       position = position-1 

      line[position]=currentvalue 

     alist[k] = line 


insertionSort(alist) 
print(alist) 
+0

通常、インプレースの変更は予期しないことに注意してください。もしあなたがこれを行うなら、あなたの関数のドキュメンテーションでそれを明確に述べるべきです。 –

+1

@Hugh Bothwell、私はあなたに同意しませんが、私はこのコードのためのドキュメントストリングを書くつもりはありません。ごめんなさい... –