2017-11-01 10 views
0

整数の配列が昇順でソートされているかどうかをチェックする関数を書いています。私は入力ファイルから少なくとも4つの配列でそれをテストしなければなりません。入力ファイルは、 11,22,33,10、1999、89(行1) 22,77,88(行2) 22,33,44,66(行3) 33、44、55、 66(4行目)。以下 は私のコードです:値のエラーと入力ファイルから配列の各行を並べ替えることができません

import sys 

file_name = sys.argv[1] 
file = open(file_name, 'r') 

for line in file.readlines(): 
    curr_arr = [] 
    for i in line.split(','): 
     curr_arr += [int(i)] 

def is_sorted(curr_arr): 
    if(len(curr_arr) < 1): 
     return True 
    if (len(curr_arr) > 2): 
     curr_min = curr_arr[0] 
     for curr_element in curr_arr: 
      if curr_element >= curr_min: 
       curr_min == curr_element 
      else: 
       return False 

     return True 

print '\nArrays of integers in {} are sorted in an increasing fashion: {}'.format(curr_arr, is_sorted(curr_arr)) 

私は、コードを実行しようとしたとき、私はValueErrorを得た:ベース10とint型のため、無効なリテラルを():「9行目で」と私がしようとしたときに私のコードは1つのだけの配列を返します4つの配列のファイルでテストします。

これは私の出力である[9、10、11、12]の整数の

アレイは増加方法でソートされている:真

+1

空白文字や他の種類の空白文字で「int」を呼び出そうとしています。私はそれがあなたが思うものではないと思うので、 'split 'が何を返すのかを再度確認してください。 – Carcigenicate

+1

ちょうど並べ替えを使用して元のリストとソートされたリストを比較してみませんか? –

+0

@Sandeep Lade:要素ごとにループし、ソートを使って比較することはできません。 – user8786892

答えて

0

iが空の値をとるため、エラーが発生し文字列''(注意深く見れば、エラーメッセージの最後に記載されています)。したがってline.split(',')''を含むリストを返しました。line自体が空文字列の場合(ただし、結果はreadlines()であってはいけません)、または行の1つが,で開始または終了した場合に発生します。配列の長さが2である場合は、別のノートで

for line in file.readlines(): 
    curr_arr = [] 
    numbers = line.split(',') 
    print(numbers) # Look for unexpected output 
    for i in numbers: 
     curr_arr += [int(i)] 

のように、line.split(',')の結果をプリントアウトしてみてください、あなたのis_sorted関数は(それがNoneを返すために、デフォルト、つまり)何も返しません、このケースはあなたの条件に捕らえられていないからです。これを修正するには、if (len(curr_arr) > 2):if (len(curr_arr) >= 2):に置き換えてください。

+0

答えに感謝します。間に、私は 'print is_sorted'を使うときだけ1配列に対してfalseを返し、さらに配列が増加する順番になります。私は 'print(numbers)'をテストしたとき、各配列の最後に '\ n'を与えてくれました。私はちょうど私の質問のファイルの内容を追加しました。私はあなたからのフィードバックを得ることができれば感謝します。ありがとうございました。 – user8786892

+0

改行 '\ n'は、それを含む文字列にも数字が含まれていれば、問題ではありません。 *正確に*エラーが発生する直前に 'print(numbers)'が何を印刷するのですか? –

+0

私はis_sort(curr_arr)の印刷をインデントした後に仕事をしました。ちょうどifステートメントが私に正しいTrue/Falseの答えを与えてくれません – user8786892

0

私が言ったように、私はValueError問題を再現できませんでした。これは私がテストのために使用される入力ファイルです:最後の行のみが処理されている

11, 22, 33, 10, 1999, 89 
22, 33, 44, 99, 66, 77, 88, 50 
22, 77, 88 
22, 33, 44, 66 
33, 44, 55, 66 

理由から、あなたのコードの先頭にforループが処理ライン毎curr_arrリストを再初期化し続けるためで、これだけの値最後に処理された行はその中に入ります。

これは、現在の行の値をarraysという新たなリストの変数に追加した後でも、コードを修正したものです。これがあなたの望むものです)それに非常に近い:

import sys 

def is_sorted(curr_arr): 
    if len(curr_arr) < 1: 
     return True 
    elif len(curr_arr) >= 2: 
     curr_min = curr_arr[0] 
     for curr_element in curr_arr[1:]: 
      if curr_element < curr_min: 
       return False 
      else: 
       curr_min = curr_element 

    return True 

#file_name = sys.argv[1] 
file_name = 'arrays.txt' 

arrays = [] 
with open(file_name, 'r') as file: 
    for line in file: 
     curr_arr = [] 
     for i in line.split(','): 
      curr_arr.append(int(i)) 
     arrays.append(curr_arr) 

for curr_arr in arrays: 
    print 'Array of integers in {} are sorted in an increasing fashion: {}'.format(
     curr_arr, is_sorted(curr_arr)) 

出力:

Array of integers in [11, 22, 33, 10, 1999, 89] are sorted in an increasing fashion: False 
Array of integers in [22, 33, 44, 99, 66, 77, 88, 50] are sorted in an increasing fashion: False 
Array of integers in [22, 77, 88] are sorted in an increasing fashion: True 
Array of integers in [22, 33, 44, 66] are sorted in an increasing fashion: True 
Array of integers in [33, 44, 55, 66] are sorted in an increasing fashion: True 
+0

ありがとう@martineau、私は[22,33,44,99,66,77,88,50]の配列でテストしました。理由はわかりません。 – user8786892

+0

user8786892:私は 'is_sorted()'にバグを導入しました。一定。 – martineau

0

split() INGの前に必ず.strip()ご入力行を作成します。

#!/usr/bin/env python3 

import io 

file_ = io.StringIO("""11, 22, 33, 10, 1999, 89 
22, 77, 88 
22, 33, 44, 66 
33, 44, 55, 66""") 


def is_sorted(array): 
    return all(a <= b 
       for a, b in zip(array, array[1:])) 


arrays = (tuple(int(n) 
       for n in line.strip().split(',')) 
      for line in file_) 
for curr_arr in arrays: 
    print('\nArrays of integers in {} are sorted in an increasing fashion: {}' 
      .format(curr_arr, is_sorted(curr_arr)) 
    ) 
関連する問題