1

我有 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 用作字典中缺失文件的值,以防止出现错误?

4

3 回答 3

1

Python getattr 文档:

getattr(object, name[, default ]) 返回对象的命名属性的值。名称必须是字符串。如果字符串是对象属性之一的名称,则结果是该属性的值。例如,getattr(x, 'foobar') 等价于 x.foobar。如果命名属性不存在,则返回默认值(如果提供),否则引发 AttributeError。

你可以这样做:

def get_features(obj, features):
    return {f: getattr(obj, f, float('Nan')) for f in features}
于 2018-03-11T16:38:10.463 回答
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}
于 2018-03-11T16:26:34.283 回答
0

NaN如果键不存在, 这应该作为默认值返回:obj.__dict__.get(feature_name, float('NaN'))

对于 Python 3.5+,NaN可作为math包中的常量使用,因此可以使用obj.__dict__.get(feature_name, math.nan)

于 2018-03-11T16:31:31.333 回答