0

負のフロートのリストがあります。それらを使ってヒストグラムを作りたいです。私の知る限り、Python は負の数の演算を行うことができません。これは正しいです?リストは [-0.2923998、-1.2394875、-0.23086493 など] のようになります。範囲が何であるかを知ることができるように、最大​​数と最小数を見つけようとしています。私のコードはエラーを出しています:

setrange = float(maxv) - float(minv)
TypeError: float() argument must be a string or a number

そして、これはコードです:

f = open('clusters_scores.out','r')
#first, extract all of the sim values
val = []
for line in f:
    lineval = line.split()
    print lineval
    val.append(lineval)
print val
#val = map(float,val)
maxv = max(val)
minv = min(val)
setrange = float(maxv) - float(minv)

「val」リストに入れられるすべての値は、負の 10 進数です。エラーは何を参照していて、どうすれば修正できますか?

入力ファイルは次のようになります。

-0.0783532095182 -0.99415440702 -0.692972552716 -0.639273674023 -0.733029194040.765257900121 -0.755438339963
-0.144140594077 -1.06533353638 -0.366278118372 -0.746931508538 -1.02549039392 -0.296715961215
-0.0915937502791 -1.68680560936 -0.955147543358
-0.0488457137771 -0.0943080192383 -0.747534412969 -1.00491121699
-1.43973471463
-0.0642611118901 -0.0910684525497
-1.19327387414 -0.0794696449245
-1.00791366035 -0.0509749096549
-1.08046507281 -0.957339914505 -0.861495748259
4

2 に答える 2

5

の結果はsplit()分割された値のリストです。これがおそらくそのエラーが発生する理由です。

たとえば、 を実行する'-0.2'.split()と、単一の値を持つリストが返されます['-0.2']

編集:ああ!入力ファイルが提供されていると、これが問題のようです: -0.733029194040.765257900121. その2つの別々のフロートを作るつもりだと思いますか?

次のように修正されたファイルを想定します。

-0.0783532095182 -0.99415440702 -0.692972552716 -0.639273674023 -0.733029194040 -0.765257900121 -0.755438339963
-0.144140594077 -1.06533353638 -0.366278118372 -0.746931508538 -1.02549039392 -0.296715961215
-0.0915937502791 -1.68680560936 -0.955147543358
-0.0488457137771 -0.0943080192383 -0.747534412969 -1.00491121699
-1.43973471463
-0.0642611118901 -0.0910684525497
-1.19327387414 -0.0794696449245
-1.00791366035 -0.0509749096549
-1.08046507281 -0.957339914505 -0.861495748259

次のコードは、その例外をスローしなくなりました。

f = open('clusters_scores.out','r')
#first, extract all of the sim values
val = []
for line in f:
    linevals = line.split()
    print linevals
    val += linevals
print val
val = map(float, val)
maxv = max(val)
minv = min(val)
setrange = float(maxv) - float(minv)

ファイルに有効な入力があれば機能するように、リストを追加するのではなく、split() からリストの結果を取得してリストに連結するように変更しました。

于 2011-08-11T16:48:58.113 に答える
1

「val」リストに入れられるすべての値は、負の 10 進数です。

いいえ、そうではありません。呼び出しによってリストが生成されるため、これらは負の 10 進数を表す文字列のリストです。とは、 に渡すことができない文字列のリストです。.split()maxvminvfloat()

エラーは何を参照していて、どうすれば修正できますか?

valの内容があなたが思っているものではないという事実を指しています。デバッグの最初のステップは、仮定を検証することです。このコードを REPL で試してみると、 and の内容を調べることができmaxvminv予想される文字列ではなく、文字列のリストがあることがわかります。

(ファイルの各行の) 文字列のすべてのリストを 1 つの文字列のリストにまとめたいとします。val.extend(lineval)ではなく使用しval.append(lineval)ます。

そうは言っても、map呼び出す前に文字列を浮動小数点数にしたい場合maxmin、そうしないと文字列を浮動小数点数ではなく文字列として比較する必要があるためです。(うまくいくかもしれませんが、明示的は暗黙的よりも優れています。)

さらに簡単に、ファイル全体を一度に読み取って分割するだけです。.split()引数なしは空白で分割され、改行は空白です。mapリスト内包表記を注意深く適用すれば、読み取りと同時に ping を実行することもできます。私は次のように書きます。

with open('clusters_scores.out') as f:
  val = [float(x) for x in f.read().split()]
result = max(val) - min(val)
于 2011-08-11T16:58:52.650 に答える