通过重复应用功能创建列表

时间:2011-07-13 18:03:58

标签: python list

我想要这个:

[foo() for _ in xrange (100)]

但更漂亮。 ?

6 个答案:

答案 0 :(得分:8)

您可以像这样编写一个生成器repeat

def repeat(times, func, *args, **kwargs):
    for _ in xrange(times):
        yield func(*args, **kwargs)

然后:

list(repeat(100, foo))

它还接受要传递给函数的参数,因此您可以:

from random import randint
list(repeat(100, randint, 1, 100))   # 100 random ints between 1 and 100

因为它是一个生成器,你可以将它管道化为任何类型的可迭代,无论是list(如此处)还是tupleset,或者在理解或循环。

答案 1 :(得分:5)

我担心你不会比Python更漂亮,除了有些人会建议反对_一个“匿名”变量。这是做你想做的事情的Pythonic成语。

_可能会让新手感到困惑,因为它可能被误认为是特殊的语法。我使用它,但仅限于我的代码的“专家部分”。我也越来越多地遇到它,但是对于这一点,意见似乎仍有点分歧。)

答案 2 :(得分:3)

根据您对“beautifuller”的定义,您可能更喜欢这个:

map(lambda x: foo(), xrange(100))

虽然你已经拥有了更好的IMO。

答案 3 :(得分:2)

根据其功能,您可以将foo()设为生成器。

答案 4 :(得分:1)

如果foo()始终返回相同的结果,您可以使用

[foo()]*100

这样做的好处是foo()只被调用一次。

编辑:正如@larsmans指出的那样,只有foo()返回不可变的结果才有意义。

在所有其他情况下,您的解决方案都很好!

答案 5 :(得分:1)

你的列表理解已经美丽而有效但如果你需要几个选项来做同样的事情,那么我认为你可以在这里使用地图。如果您需要使用指定的次数调用某个函数:

# in case your func looks like
def func():
    # do something
#then
map(func(), xrange(numberOfTimes))

如果你的函数需要来自范围的值,那么你可以使用map with lambda:

# in case your func looks like
def func(value):
    # do something with value
#then
map(lambda val: func(val), xrange(numberOfTimes))

或者如果您需要使用来自相同长度的多个列表中的数据:

# in case your func looks like
def func(value1, value2):
    # do something with values
#then
map(lambda val: func(*val), zip(xrange(10), xrange(10,20)))

等等......