从可调用对象或lambda填充列表或元组在Python中

4 投票
5 回答
9909 浏览
提问于 2025-04-17 09:24

最近我遇到一个问题,感觉挺常见的。谷歌上找不到答案,所以我来问问Stack Overflow的朋友们。

我想找个简单的方法,把一个函数的输出放到一个列表里。像这样:

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

5 个回答

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

你觉得它们为什么效率低呢?

其实还有另外一种方法,可以用列表推导式来实现。

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

你觉得用列表推导式怎么样呢?

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

另外,在很多情况下,你只需要这些值一次。这时候,使用生成器表达式会更好,因为它可以按需计算值,而且不需要额外的内存。

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则是按需计算值,不会占用额外的内存(它是一个生成器)。

撰写回答