2016-04-09 22 views
-2

番号772,357,155,141(1425と等しい)を合計したいこの機能に問題があります。特定の文字列に続くファイルで4つの数字を合計しようとしています

番号は以下の入力ファイルに文字列 'FO203509.1' に従ってください。

enter image description here

ここに私のコードです:

def sum_nt(input): 
    for line in input: 
     line=line.rstrip() 
     if not line.startswith('#'): 
      line=line.split() 
      subject_id=line[1] 
      a=line[3] 
      if subject_id=='FO203509.1': 
       sum(a) 
    return a 

ans3=sum_nt(input) 
print(ans3) 

私はエラーを取得しています:

local variable a referenced before assignment 

ご協力いただければ幸いです。ありがとうございます!

+0

コード内の他の部分を使用しただけです。別の変数名を使用してください。 –

+0

変数名を何に変更しても、これを試してもまだ動作していません。私はこの変数名をxに変更しました。 – pythonbeginner2506

答えて

2

汚いQuick'n:

def sum_nt(input): 
    values = [] 
    for line in input: 
    if not line.startswith('#'): 
     split_line = line.split() 
     subject_id = split_line[1] 
     if subject_id == 'FO203509.1': 
     values.append(int(split_line[3])) 
    return sum(values) 

ここに何が起こる:

  • もともと空である '値' と呼ばれるリストがあります。要約したい値(つまり「FO203509.1」に続く値)がこのリストに表示されるようにしたいと考えています。これはvalues.append()によって行われます。
  • sum()は最後に 'values'のすべての合計を計算します。 sum()は単一の値ではなく、iterableで動作することに注意してください。例:sum([1,2,3])は6を返します。sum(a)は繰り返し可能ではなく文字列値として機能しません。
  • a = line [3] - >これは分割文字列の4番目の要素を文字列としています。あなたの場合、数値の合計を計算したいので、これは(整数)数値として解釈する必要があります。したがって、次のように変換する必要があります:a = int(line [3])。注:これは、line [3]に実際に数値として解釈できる文字列が含まれている場合にのみ機能します。そうでない場合、ValueErrorが得られます。 int( "42")は動作しますが、int( "foo")は動作しません。
  • さらにヒント:変数の再利用には注意してください。元の行と分割された行の両方に "行"を使用しました。別の変数(「行」や「分割線」など)を使用すると、読みやすさが向上し、何が起こっているのかをよりよく理解するのに役立ちます。
+0

コードのダンプと実行だけでなく、OPのコードに何が間違っているのかを説明する必要があります。 – csmckelvey

+0

これはまさに私がやりたかったことであり、append()の使用については考えていませんでした。しかし、私はまだ私のコードで何が間違っていたのかわかりません、なぜ私はエラーを取得しましたか?私は改善したいと思う、私はどこに間違っているが理解する必要がありますが、ありがとう! – pythonbeginner2506

+0

いくつかのコメントを追加しました。 IPython(https://ipython.org/)をインストールし、Pythonのチュートリアルをいくつかお試しください。 –

1

"for"セクションと "return a"は、関数定義と一致させるためにインデントする必要があります。

def sum_nt(input): 
    for line in input: 
     line=line.rstrip() 
     if not line.startswith('#'): 
      line=line.split() 
      subject_id=line[1] 
      a=line[3] 
      if subject_id=='FO203509.1': 
       sum(a) 
    return a 

ans3=sum_nt(input) 
print(ans3) 
+0

申し訳ありませんが、このようにインデントされていました。コピーして貼り付けたときにインデントを上げてしまいましたが、今修正します。 – pythonbeginner2506

+0

よろしいですか。エラーについてもっと詳しく説明できますか?どの線がこの定義を参照していますか? –

+0

私はあなたの問題は、sum(a)を変数に代入せずに動作しないsum(a)と関係すると思います。 –

関連する問題