3

数値のリストを文字列としてリスト内包表記を実行しているため、たとえば、リストは次のようになります

vals = ['0.13', '324', '0.23432']

次のようなリスト内包表記を試してください。

best = [x for x in vals > 0.02]

TypeError: iteration over non-sequence が発生します。

リストは、反復できる最初のものであるべきシーケンスではありませんか? シーケンスとは

私が見つけている基本的な質問に対する答えを見つけるのは難しい.

ありがとう。

4

4 に答える 4

8

シーケンスが大きいかどうかではなく、各項目が '0.02' より大きいかどうかを確認する必要があります。

best = [x for x in vals if x > '0.02']

元の式[x for x in vals > '0.02']は として解析され[x for x in (vals > '0.02')]ます。vals > '0.02'はブール値であり、シーケンスではないため、それを反復処理することはできません。

編集:コメントでジョーの提案ごとに文字列を使用するようにこの回答を更新'0.02'しました(ありがとう)。これはこのシナリオでは機能しますが、辞書式の比較ではなく数値比較を本当に実行したい場合は、次を使用できます。

best = [x for x in vals if float(x) > 0.02]

これは浮動小数点数に変換xされるため、おそらく意図したとおりに、浮動小数点数を別の浮動小数点数と比較しています。リスト内包表記の結果は文字列のリストのまま[x for ...]です[float(x) for ...]。ちょっと考えさせられます。

于 2011-02-17T01:08:51.670 に答える
4

いいえ、vals > 0.02厳密にはシーケンスではありません。また、文字列 (vals に含まれる) を比較しても、期待する結果が得られません。あなたがしたいかもしれません:

vals = [0.13, 324.0, 0.23432]
best = [x for x in vals if x > 0.02]

そうは言っても、必ずNumPyを見てください。例を次のように書くことができます。

from numpy import *
vals = asarray([0.13, 324.0, 0.23432])
best = vals[vals > 0.02]

大したことではないように思えるかもしれませんが、数値配列と行列の操作で見逃したくない機能と利点が数多く提供されます。

于 2011-02-17T01:14:58.217 に答える
2

vals > 0.02シーケンスではないものを反復しようとしています。何でもフィルタリングしようとしている場合は、次のようにし0.02ます。 [x for x in vals if x > 0.02]

于 2011-02-17T01:08:55.070 に答える
1

また、別の問題があります (x > 0.02 の場合の欠落は別として)、文字列のリストをフロートと比較しています。

したがって、おそらくあなたが望むのは[x for x in vals if x > '0.02']

これにより、期待どおりの動作が得られることをテストしました。['324', '0.23432']

于 2011-02-17T01:14:45.993 に答える