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