如何使用lambda循环而不保存值

时间:2017-05-19 19:12:28

标签: python lambda iteration

在Django中,我有一个页面,可以在组中添加或删除用户。我正在检索用户列表的formdata,然后确定需要从组中删除或添加哪些用户。由于某种原因,使用lambda里面的地图并没有影响任何变化,但据我所知,它应该,对吧?

我想做类似的事情:

map(lambda x: x.group.remove(this_group).save(), users_to_remove)
map(lambda x: x.group.add(this_group).save(), users_to_add)

但它不会起作用。我不得不使用循环:

for user in users_to_remove:
    user.coi.remove(this_coi)
for user in users_to_add:
    user.coi.add(this_coi)

1 个答案:

答案 0 :(得分:0)

我不知道你的代码应该做什么,因为你没有提供MCVE因此我甚至对回答这个“问题”犹豫不决。但是,您似乎希望使用map来修改可迭代的内容并放弃map的返回值。

你可以这样做,但这是一个坏主意。这基本上是你要做的(或者我从你的代码中推断出来的):

>>> kill = 1
>>> mylist = [[1, 2], [3, 1, 9]]
>>> map(lambda x: x.remove(kill), mylist)
[None, None]
>>> mylist
[[2], [3, 9]]

如您所见,kill已从每个子列表中删除,但您构建了一个完全不必要的(临时)内存消耗列表[None, None]lambda函数的返回值mylist)中的每个子列表。

如果要将函数应用于iterable并实际关注该函数的返回值,则应使用map,即您需要所有返回值的新迭代。使用map来改变迭代是违反其预期用途的(因此对大多数python程序员来说很混乱)并且效率低下。

如果需要循环,请使用循环。写较少的行没有多余的要点。

除非你在SO上获得一个聪明的oneliner的upvotes。