Python 应用动态列表理解(列表追加)

Python applying dynamic list comprehension (list append)

vals= [1]
for j in xrange(i):
    vals.append([k for k in f(vals[j])])

此循环通过循环将值附加到自身。如果我将其压缩为列表推导式,它就不起作用,因为它不会 "dynamically" 在每次迭代中使用自身扩展 vals——它会按照最初的框架处理 vals。

有没有办法像这样动态追加单行列表理解?根据我的研究,看起来我可能正在寻找 reduce 功能? (相当于一折)

您确实可以为此使用 reduce,将初始列表用作第三个参数。

>>> def f(lst):
...     return [x+1 for x in lst] + [len(lst)]
>>> reduce(lambda lst, i: lst + [f(lst[i])], range(5), [[1]])
[[1], [2, 1], [3, 2, 2], [4, 3, 3, 3], [5, 4, 4, 4, 4], [6, 5, 5, 5, 5, 5]]

(请注意,初始列表可能应该是 [[1]],而不是 [1],否则您将在第一次迭代中将数字传递给 f,但在接下来的所有列表中迭代。)

另请注意,关于性能,您的原始循环可能会更快一些,因为 reduce 基本上必须在每次迭代中创建两个新列表,而您只需附加到一个列表。就个人而言,我会使用循环的变体,删除(可能无用的)内部列表理解并使用 [-1] 来明确你总是使用以前的结果。

vals = [[1]]
for _ in xrange(n):
    vals.append(f(vals[-1]))