在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)
答案 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。