gpt4 book ai didi

python lambda for list_of_list 折叠

转载 作者:行者123 更新时间:2023-11-30 23:00:31 25 4
gpt4 key购买 nike

好吧,新手因 list_of_list 崩溃而陷入困境。

我已经发现我可以将下面的 for 循环简化为可理解的。

lol = [[0, 1, 2, 3, 4, 50, 51, 52, 53, 54], \
[50, 51, 52, 53, 54], \
[150, 151, 152, 153, 154]]

collapsed_lol = list()
for innerlist in lol:
for item in innerlist:
collapsed_lol.append(item)

collapsed_lol = [item for innerlist in lol for item in innerlist]

但是后来我尝试了reduce(lambda) 方法并摆脱了困境。为什么这不起作用?

collapsed_lol = reduce(lambda a,x: a.extend(x), lol)
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# File "<stdin>", line 1, in <lambda>
# AttributeError: 'NoneType' object has no attribute 'extend'
# lol
# [[0, 1, 2, 3, 4, 50, 51, 52, 53, 54, 50, 51, 52, 53, 54], [50, 51, 52, 53, 54], [150, 151, 152, 153, 154]]
# so lol[0].append[lol[1]] did occur, but then stopped.

如果我将 lambda 分配给一个变量而不是内部的reduce,它会执行相同的操作,成功执行 lol[0].extend[lol[1]];返回值为 None。

f = lambda a,b: a.extend(b)
lst_1 = [0, 1, 2, 3, 4, 5]
lst_2 = [50, 51, 52, 53, 54]
ret=f(lst_1,lst_2)
ret # is nothing
lst_1
# [0, 1, 2, 3, 4, 5, 50, 51, 52, 53, 54]
lst_2
# [50, 51, 52, 53, 54]
print f(lst_1,lst_2)
# None

这与嵌套化简结构中的行为相同。

显然我正在尝试一些不起作用的东西,而不是 lambda 应该使用的方式 - 但有人可以解释 None 代表什么,这里涉及的过程是什么?谢谢

最佳答案

传递给reduce的函数必须返回fn(a,b)的值。由于 extend() 返回 None,因此您无法使用已有的 lambda。

可以通过将其更改为以下内容来强制 lambda 返回值:

fn = lambda a,b: a.extend(b) or a

并调用reduce(fn, lol)将返回“lol”中附加在一起的所有列表的值。请注意会发生什么。您还需要将 lol 的第一个元素修改为该求和值。为什么?由于第一次调用 reduce() 使用给定序列的前 2 个元素作为 ab,因此调用 fn(a ,b),并使用该返回值作为下一次调用的 a,以及 b 列表中的下一个元素,依此类推,直到 list 已用完。如果它是用 Python 编写的,它将类似于:

def reduce(fn, seq):
seq_iter = iter(seq)
a = next(seq_iter)
for b in seq_iter:
a = fn(a,b)
return a

由于 extend() 更新了列表,因此您将重复扩展该 lol[0] 元素。

您可能最好使用 sum(lol, []) 来展平列表列表。相对于制作许多中间列表副本,它有一些内存缺陷,但对于像这样的短列表,它非常简单并且可以完成工作。

如果您绝对要使用 reduce 并且不想修改 lol 的内容,只需使用 reduce(lambda a,b: a +b,哈哈)。这也会生成许多中间列表,但不会修改 lol 的内容(因为当 ab 是列表时,a+b 返回一个新列表,它不会像 extend() 那样就地修改。

关于python lambda for list_of_list 折叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35238473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com