4

これは私が最近よく遭遇する問題です。グーグルは答えを持っていないようですので、私はそれをスタックオーバーフローの良い人々に持ってきます。

関数の出力をリストに入力する簡単な方法を探しています。このようなもの:

fill(random.random(), 3) #=> [0.04095623, 0.39761869, 0.46227642]

これを行うために私が見つけた他の方法があります。しかし、彼らは非効率に見えるので、私は彼らに本当に満足していません。

results = []
for x in xrange(3): results.append(random.random())
#results => [0.04095623, 0.39761869, 0.46227642]

map(lambda x: random.random(), [None] * 3)
#=> [0.04095623, 0.39761869, 0.46227642]

提案?


すべての答えをありがとう。もっとPython風の方法があることは知っていました。

そして効率の質問に...

$ python --version
Python 2.7.1+
$ python -m timeit "import random" "map(lambda x: random.random(), [None] * 3)"
1000000 loops, best of 3: 1.65 usec per loop
$ python -m timeit "import random" "results = []" "for x in xrange(3): results.append(random.random())"
1000000 loops, best of 3: 1.41 usec per loop
$ python -m timeit "import random" "[random.random() for x in xrange(3)]"
1000000 loops, best of 3: 1.09 usec per loop
4

5 に答える 5

12

リスト内包はどうですか?

[random.random() for x in xrange(3)]

また、多くの場合、値は1回だけ必要です。このような場合、値をジャストインタイムで計算し、メモリ割り当てを必要としないジェネレータ式が望ましいです。

results = (random.random() for x in xrange(3))
for r in results:
   ...
# results is "used up" now.
# We could have used results_list = list(results) to convert the generator

ちなみに、Python 3.xでは、xrangeがに置き換えられましたrange。Python 2.xではrange、メモリを割り当ててすべての値を事前に計算しますが(リスト内包表記など)、xrange値をジャストインタイムで計算し、メモリを割り当てません(ジェネレーターです)。

于 2012-01-02T18:21:22.303 に答える
2

なぜ彼らは非効率的だと思いますか?

それを行う別の方法があります、リスト内包

listt= [random.random() for i in range(3)]
于 2012-01-02T18:22:13.593 に答える
0

リスト内包表記はおそらく最も明確ですが、itertools愛好家にとっては:

>>> list(itertools.islice(iter(random.random, None), 3))
[0.42565379345946064, 0.41754360645917354, 0.797286438646947]

の簡単なチェックtimeitは、itertoolsバージョンが10を超えるアイテムに対してこれまでになくわずかに高速であることを示していますが、それでもあなたにとって最も明確と思われるものを使用します。

C:\Python32>python lib\timeit.py -s "import random, itertools" "list(itertools.islice(iter(random.random, None), 10))"
100000 loops, best of 3: 2.93 usec per loop

C:\Python32>python lib\timeit.py -s "import random, itertools" "[random.random() for _ in range(10)]"
100000 loops, best of 3: 3.19 usec per loop
于 2012-01-02T19:03:23.033 に答える
0
   list =  [random.random() for i in xrange(3)]
   list =  [random.random() for i in [0]*3]
   list =  [i() for i in [random.random]*3]

または :

  fill =lambda f,n: [f() for i in xrange(n)]
  fill(random.random , 3 ) #=> [0.04095623, 0.39761869, 0.46227642]
于 2012-01-02T18:20:30.817 に答える
0

もっと一般的なもの...

from random import random

fill = lambda func, num: [func() for x in xrange(num)]
# for generating tuples:
fill = lambda func, num: (func() for x in xrange(num))


# then just call:
fill(random, 4)
# or...
fill(lambda : 1+2*random(), 4)
于 2012-01-02T18:28:10.277 に答える