在python中填充callable或lambda中的列表或元组

时间:2012-01-02 18:19:03

标签: python arrays list tuples callable

这是我最近遇到的一个问题。谷歌似乎没有答案所以我把它带给堆栈溢出的好人。

我正在寻找一种使用函数输出填充列表的简单方法。像这样:

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 --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

5 个答案:

答案 0 :(得分:11)

list comprehension怎么样?

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

此外,在许多情况下,您只需要一次值。在这些情况下,最好是generator expression计算正确的值并且不需要内存分配:

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只是及时计算值并且不分配内存(它是生成器)

答案 1 :(得分:2)

为什么你认为它们效率低下?

还有另一种方法,列表理解

listt= [random.random() for i in range(3)]

答案 2 :(得分: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]

答案 3 :(得分: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)

答案 4 :(得分:0)

列表理解可能是最清晰的,但对于itertools afficionado:

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

使用timeit进行快速检查表明,对于超过10个项目,itertools版本的速度要快得多,但仍然可以使用最清晰的内容:

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