【问题标题】:Create list by repeated application of function通过重复应用函数创建列表
【发布时间】:2011-10-04 17:39:58
【问题描述】:

我想要这个:

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

但更漂亮。 ?

【问题讨论】:

  • 来自 C# 背景,非常漂亮。比Enumerable.Range(0, 100).Select(x => foo());漂亮。

标签: python list


【解决方案1】:

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

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

虽然您已经拥有的 IMO 要好得多。

【讨论】:

  • 如果你必须使用lambdamap()(好吧,我听过的大多数人都认为)不像等效的列表理解那样pythonic。
【解决方案2】:

你可以像这样写一个生成器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,或者在理解或循环中使用它。

【讨论】:

    【解决方案3】:

    您的列表理解已经很漂亮和有效,但是如果您需要多个选项来做同样的事情,那么我认为您可以在这里使用 map。如果您需要调用某个函数指定的次数使用:

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

    如果您的函数需要范围内的值,那么您可以将 map 与 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)))
    

    等等……

    【讨论】:

      【解决方案4】:

      根据它的作用,您可以将foo() 设为生成器。

      【讨论】:

      • 在我的情况下(foo 是一个简单的函数,每次调用都会返回不同的未参数化结果),使它成为一个生成器似乎是矫枉过正。
      【解决方案5】:

      如果foo() 总是返回相同的结果,你可以使用

      [foo()]*100
      

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

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

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

      【讨论】:

      • 但是如果 foo 返回可变结果,即使它们与 == 比较相等,这在你的脸上爆炸。
      • 这是错误的,因为 foo() 只被调用一次,而不是 OP 中的 100 次调用:[randint(1,100)]*5[26, 26, 26, 26, 26]
      • 这就是为什么我指出foo() 必须始终返回相同的结果——randint() 显然不会这样做。
      【解决方案6】:

      恐怕你不会得到它比 Python 中的更漂亮,除了有些人会建议不要 _ 使用“匿名”变量。这是做你想做的事的 Pythonic 习语。

      (_ 对新手来说可能会让人感到困惑,因为它可能会被误认为是特殊的语法。我使用它,但只在我的代码的“专家部分”中使用它。我也越来越频繁地遇到它,但意见在这一点上似乎仍然有些分歧。)

      【讨论】:

      • 我认为_ 是未使用变量的pythonic 名称?
      • @Davy8:似乎不是每个人都同意; @Sven Marnach 得到了两个支持,他告诉我not to use _ this way
      • 使用_ 的一个优点是它可以防止 PyLint 抱怨未使用的变量。我认为任何以_ 开头的变量名都可以。
      • 我个人更喜欢ignored_ignored 之类的东西,因为这实际上是以被忽略变量的名称表示的。
      猜你喜欢
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 2021-11-12
      • 2020-11-15
      • 2016-07-17
      • 2021-07-26
      相关资源
      最近更新 更多