Python 映射(lambda,list)返回None而不是object
我想向列表中的所有对象(django中的模型实例)添加属性。例如,该列表是:Python 映射(lambda,list)返回None而不是object,python,django,Python,Django,我想向列表中的所有对象(django中的模型实例)添加属性。例如,该列表是: persons = [ {"age":"12","name":"John"}, {"age":"10","name":"Joye"} ] 我们假设我想把person.age的值放在person.number中,我有一个新列表,所有person都有一个新属性number,所以我的函数是: new_persons_list=list(map(lambda person:setattr(pe
persons = [
{"age":"12","name":"John"},
{"age":"10","name":"Joye"}
]
我们假设我想把person.age
的值放在person.number
中,我有一个新列表,所有person都有一个新属性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。有什么问题吗?谢谢你没有那么容易,所以请使用:
new_persons_list=list(map(lambda person:{**person.to_dict(), "number": person.age}, persons))
注意:对于上述示例代码,它将引发一个属性错误
,因为字典没有.age
属性。我假设您使用Django对象,如果您定义了一个字段,那么这些对象确实具有属性
setattr(..)
函数更新对象。大多数更新某些内容的函数都不会返回某些内容(这本身并不正确,但对于许多函数来说,这是正确的)
因此,您的列表只是获取setattr
调用的结果。我们可以通过以下方式规避该问题:
new_persons_list=list(map(lambda person: setattr(person, 'number', person.age) or person, persons))
这是一个好主意,但出现错误
“person”对象不可下标。然后我尝试将其修改为new\u persons\u list=list(map(lambda person:{**person,“number”:person.age},persons))
,出现了新的错误:'person'对象不是一个映射
。这个对象是模型实例,所以我认为我们需要在lambda中使用setattr
,对吗?@mehdi您的第二条评论不正确,但是你能告诉我什么是print(type(persons[0])
吗?@mehdi我的代码现在能用了吗?给我打印(键入(persons[0])
s,如果它不起作用。错误是“person”对象没有属性“to dict”
。当我运行print(type(persons[0])
时,输出是
setattr(..)
将返回None
,因为它不计算某些内容,它会更改某些内容。上述操作应引发属性错误,而不是返回None
s。看起来你的样本数据不正确。谢谢你的解释,范·昂森先生。我使用map(function,list)
来实现这一点,只不过该函数是setattr(badge,'create_date',badge.assign_date)return badge
。但是由于我从来没有使用过lambda,我现在想知道它是如何工作的,这是我第一次在我的项目中使用它,所以我想尽量使用lambda
,因为它需要非常干净和小的代码。@mehdi:lambda是lambda i:setattr(badge'create_date',badge.assign_date)或badge
。lambda没有返回
,因为您可以将其视为具有隐式返回的函数。
for person in persons:
person.number = person.age