3

したがって、一部のデータセットを削減し、削除された要素の数を返す関数があります。関数の操作中に削減されたアイテムの数がゼロになったら、適用を停止する必要があります。現在、私はこれを持っています:

num_removed = reduction_pass(dataset)
while num_removed > 0:
    num_removed = reduction_pass(dataset)

しかし、これらの 2 つの変数の割り当ては、ちょっと気になります。これを書くよりエレガントな方法はありますか?

4

5 に答える 5

4

最終的な戻り値は、削除された要素の数を示していると想定しているため、実際には必要ないと思います。これは、最後のパスでは明らかに常に 0 です。

複雑な方法よりも単純な方法:

while reduction_pass(dataset) > 0: pass

見せびらかす、明らかに深刻ではない方法:

from itertools import *
list(takewhile(lambda x: x > 0, starmap(reduction_pass, repeat((dataset,)))))
于 2011-10-24T09:04:25.487 に答える
1

でイテレータを取得できます

it = iter(lambda: reduction_pass(dataset), 0)

これは、すべてのステップで、指定された関数を呼び出し、0 が取得されると停止します。

このイテレータを使用すると、次のことができます

for num_removed in it:
    do_whatever()
于 2011-10-24T09:08:32.697 に答える
0

はい、Python では条件制御構造内にステートメントを使用できません。それにはプラスがあり、マイナスがあります。

2 つの var の割り当てが非常に煩わしい場合は、次の方法が適しているかもしれません。

while True:
  num_removed = reduction_pass(dataset)
  if num_removed <= 0:
    break

一般的には、あまり気にする必要はないと思います。

于 2011-10-24T08:57:28.240 に答える
0

私にとって最も明白な方法は次のとおりです。

num_removed = None
while num_removed is None or num_removed > 0:
    num_removed = reduction_pass(dataset)
于 2011-10-24T08:58:15.150 に答える
0

通常、ブレークを含むwhileループは最も単純で最適ですが、ループすると言ったときに、num_removed > 0実際には を意味していた可能性があると仮定するとnum_removed != 0、かなりクリーンな代替手段が次のようになります。

for num_removed in iter(lambda: reduction_pass(dataset), 0):
    pass

もちろんnum_removed、ループ本体内の何かの中間値が実際に必要な場合にのみ意味があります。

于 2011-10-24T09:12:13.617 に答える