2017-05-19 22 views
-3

在Django中,我有一個頁面,用戶可以在其中添加或刪除用戶。我正在檢索用戶列表的formdata,然後確定哪些需要從組中刪除或添加。出於某種原因,使用lambda內部映射不會影響任何更改,但據我瞭解,它應該,對嗎?如何使用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) 
+5

你在濫用map函數... –

+1

首先,你的循環體和你的lambdas做了一些不同的事情(waht的'save'應該這樣做?)。其次,您的問題缺少一個具有顯示問題的具體數據結構的最簡單示例。最重要的是,爲了避免循環,你不要使用'map',當你想構建一個新的迭代器時,你可以使用'map'。如果你不想在代碼審查中出現問題,那就是。 – timgeb

+0

正如蒂姆建議的那樣,您的示例對我們來說不夠詳細,無法重現問題。請參閱以下示例:https://gist.github.com/anonymous/3a5812c6326e52671580d8f30df172f6 – alfasin

回答

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]mylist中每個子列表的lambda函數的返回值)。

當你想將一個函數應用到一個iterable並且真正關心該函數的返回值時,你應該使用map,即你想要所有返回值的新迭代。使用map來改變一個可迭代的地方是違反它的預期用途的(因此會讓大多數python程序員感到困惑)並且效率低下。

如果您需要循環,請使用循環。寫更少的行沒有額外的要點。

除非你在SO上得到upvotes的聰明oneliner。