map(lambda,list) 返回 None 而不是对象



我想将属性添加到列表中的所有对象(即 django 中的模型实例)。 例如,列表为:

persons = [
{"age":"12","name":"John"},
{"age":"10","name":"Joye"}
]

我们假设我想把person.age的值放在person.number,我有一个新的列表,所有人都有新的属性number所以我的函数是:

new_persons_list=list(map(lambda person:setattr(person, 'number', person.age), persons))

但是输出是[None,None],而我希望输出是:

persons = [
{"age":12,"name":"John","number":12},
{"age":10,"name":"Joye","number":10}
]

如果可能的话,我不喜欢在map中添加新函数,我想使用 lambda。有什么问题?谢谢

注意:使用上面的示例代码,它将引发一个AttributeError,因为字典没有.age属性。我假设你使用 Django 对象代替,如果你定义了一个字段,它们确实具有属性。

setattr(..)函数更新对象。大多数更新某些内容的函数不会返回某些内容(这本身不是真的,但对于许多函数来说,这是成立的)。

因此,您的列表只是获取setattr调用的结果。我们可以通过以下方式规避这个问题:

new_persons_list=list(map(lambda person: setattr(person, 'number', person.age)or person, persons))

但更有意义的是,您在此处仅使用for循环来更新对象:

for person in persons:
person.number = person.age

这并不容易,所以使用:

new_persons_list=list(map(lambda person:{**person.to_dict(), "number": person.age}, persons))