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

2024-10-04 09:18:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把属性添加到列表中的所有对象(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中添加新函数,我想使用拉姆达。什么有问题吗?谢谢


Tags: 对象django函数namenonenumbermap列表
2条回答

这没那么容易,所以使用:

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

Note: with the above sample code, it will raise an AttributeError, since a dictionary has no .age attribute. I assume that you use Django objects instead which indeed have attributes if you defined a field.

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

相关问题 更多 >