我有20K对象和列表中提供的一组功能。我需要从每个对象中提取这些功能并将它们保存到字典中。每个对象有近100个功能。
例如:
# object1
Object1.Age = '20'
Object1.Gender = 'Female'
Object1.DOB = '03/05/1997'
Object1.Weight = '130lb'
Object1.Height = '5.5'
#object2
Object1.Age = '22'
Object1.Gender = 'Male'
Object1.DOB = '03/05/1995'
Object1.Weight = '145lb'
Object1.Height = '5.8'
#object3
Object1.Age = '22'
Object1.Gender = 'Male'
Object1.DOB = '03/05/1995'
Object1.Weight = '145lb'
#object4
...
我需要从每个对象中提取的功能列表(此列表可能会更改,因此我需要代码灵活处理它):
features = ['Gender',
'DOB',
'Height']
目前,我正在使用此功能捕获每个对象所需的所有功能:
def get_features(obj, features):
return {f: getattr(obj, f) for f in features}
如果所有对象都具有我想要的所有功能,则此功能可以正常工作。但有一些对象没有所有功能。例如,object3没有名为" Height"的字段。如何将NaN用于我的字典中丢失文件的值,以便我可以防止出错?
答案 0 :(得分:1)
getattr(对象,名称[,默认]) 返回object的named属性的值。 name必须是一个字符串。如果字符串是对象属性之一的名称,则结果是该属性的值。例如,getattr(x,' foobar')等同于x.foobar。 如果指定的属性不存在,则返回default(如果提供),否则引发AttributeError。
你可以这样做:
def get_features(obj, features):
return {f: getattr(obj, f, float('Nan')) for f in features}
答案 1 :(得分:0)
您可以使用obj.__dict__
:
def get_features(obj, features):
return {f:obj.__dict__.get(f, 'NaN') for f in features}
或者,如果您仍希望使用getattr
,则可以实施hasattr
:
def get_features(obj, features):
return {f:'NaN' if not hasattr(obj, f) else getattr(obj, f) for f in features}
答案 2 :(得分:0)
如果密钥不存在,则应将NaN
作为默认值返回:obj.__dict__.get(feature_name, float('NaN'))
对于Python 3.5+,NaN
在math
包中可用作常量,因此可以使用obj.__dict__.get(feature_name, math.nan)