2

多くの場合、Pythonを使用していると、次のようなリスト内包表記を記述していることに気付くでしょう。

num_foobars = 10
foobars = [create_foobar() for idx in xrange(num_foobars)]

明らかにそれは問題なく機能しますが、実際にその情報をまったく使用していないときに、範囲を作成してその全体でダミーインデックスを反復することには、まだ少し厄介な感じがします。

私はパフォーマンスなどについてはまったく心配していません。Pythonが通常行うほど素晴らしくエレガントな感じはしません。

リスト内包表記構文の不要な部分を回避するための、おそらくのようなmapものを使用しitertoolsて、より似たコードを提供するための、慣用的な方法があるかどうか疑問に思っています...

num_foobars = 10
foobars = repeat(create_foobar, num_foobars)
4

4 に答える 4

6

itertoolsの方法は次のとおりです。

list(starmap(create_foobar, repeat((), 10)))

itertoolsの方法は短くて速いです。そうは言っても、私はリスト内包表記を好みます:-)

于 2012-01-18T14:27:15.787 に答える
1

引数を受け入れる場合create_foobarは、引数のリストを反復処理するだけです。のように

[create_foobar(x) for x in arg_list]

また

[create_foobar(*x) for x in [arg_tuple] * 10]

しかし、create_foobar引数をとらない特別な場合では、次のようなことができると思います。

>>> class Foobar(object):
...     def __init__(self):
...         self.a = random.randrange(0, 10)
...     def __repr__(self):
...         return str(self.a)
... 
>>> map(lambda x: x(), [Foobar] * 10)
[2, 5, 3, 4, 7, 4, 6, 3, 3, 6]

しかし、ラムダは少し醜いです。Raymond Hettingerの感情を反映して、標準的なリスト内包表記が望ましいと思います。また、これにより、反復するためのかなり長くて役に立たないリストが作成されることにも注意してください。これは、標準的なアプローチでは回避されます。itertools.repeatを使用して反復可能なsを作成することでこれを修正できますFoobar...さらに複雑になります。

>>> map(lambda x: x(), itertools.repeat(Foobar, 10))
[1, 4, 4, 6, 2, 4, 9, 9, 1, 6]

より一般的には、これを考慮してください。何も繰り返さない場合は非表示になっている場合でも、インデックス変数が必要です。明示的は暗黙的よりも優れています。

于 2012-01-18T14:38:46.610 に答える
0

関数を定義することもできますrepeatが、それを書くための慣用的な方法はそれでも

def repeat(f, max_n):
    return [f(i) for i in xrange(max_n)]

申し訳ありません。xrange私は、ベースの構成がしばしば見苦しく見えることに同意しますが、それは言語がどのように機能するかだけです。

于 2012-01-18T14:21:28.537 に答える
-1
def repeat(creator, num):
    return [create() for x in xrange(num)]

; c)

于 2012-01-18T14:21:49.797 に答える