map(lambda,list)返回None代替对象

时间:2019-08-14 06:30:27

标签: python django

我想为列表中的所有对象(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。这是什么问题?谢谢

2 个答案:

答案 0 :(得分:1)

这不是那么容易,所以使用:

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

答案 1 :(得分:1)

  

注意:使用上述示例代码,由于字典没有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