2016-04-27 19 views
-2
def insertionSort(a): 
    for i in range(1, len(a)): #outer loop covering the range 
     value = a[i] #value = to list, which will compare items to the left 
     i = i - 1 #i goes lower than index to compare further to the left 
     while i >= 0 : #keep comparing till its at the beginning of the list 
      if value < a[i]: #if value is less than i 
       a[i+1] = a[i] # shift number in right i to slot i + 1 
       a[i] = value # shift value that was left into slot i 
       i = i - 1 
      else: 
       break 

infile = open("file1.txt", "r") 
a=[] 
for aline in infile: 
    a = aline.split() 

insertionSort(a) 
print(a) 

これは、ファイル内にあるものである:ファイルから読み込んだリストをソートしますか?

7686850495948548545 

私は、ファイル上で動作するようにinsertionSort()機能を入手するにはどうすればよいですか?

+0

ファイルにはすべての数値が1行に含まれていますか? – trans1st0r

+1

'a = aline.split()'を実行すると、変数 'a'の外側に参照が保持されないので、forループの次の繰り返しが次の行で上書きされるので、何が起こるのかはソートon **ファイルの最後の行** ** –

+0

'a.extend(aline.split())を実行した場合、その行のすべての単語(または数字)でリストを拡張し、それらのうちのforループの後に。 –

答えて

2

この部分は正しくありません。あなたは、文字列内の数字を持っていたら、あなたのようなリストにそれらを分割することができ、その後

with open('some_file.txt', 'r') as in_file: 
    string_numbers = in_file.read() 

infile = open("file1.txt", "r") 
a=[] 
for aline in infile: 
    a = aline.split() 

開口部と読んで(または書き込み)ファイルの好ましい方法は以下のとおりです。そう:

nums_list = list(string_nums) 

だからnums_listはリスト内包してint型に変換し、今で文字列のリストであります

nums = [int(num) for num in nums_list] 

EDIT:

は楽しみのためだけに、ここでは簡潔なバージョンです:

with open('filename.txt') as in_file: 
    nums = [int(n) for n in list(in_file.read().strip())] 

.strip()だけで何の奇妙な空白鋳造を確保しないために追加しました。

+0

'string_nums.split()'はあなたの考えをしません。 Pythonコンソールで ''7686850495948548545'.split()'の結果を確認してください。 – martineau

+0

あなたは絶対に正しいです、私は 'list(string_nums)'を意味しました。ありがとう、編集されました。 – Will

+0

ありがとうございます! :+) –

0

あなたの問題の1つは、aに繰り返し割り当てられていることです。それはあなたが望むものではありません。今すぐあなたはaに空のリストを割り当てることから始まります。次に、以前にaに割り当てられたものを置き換えるたびに、分割された各行をaに割り当てます。

a.extend(aline.split()) 

それを修正して、私たちはあなたのコードは、次に実行方法をよく知ってみましょう:私はあなたが実際にあなたのループの内側にしたいことはあると思います。

関連する問題