构建所选功能的字典

时间:2018-03-11 16:19:25

标签: python dictionary missing-features

我有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用于我的字典中丢失文件的值,以便我可以防止出错?

3 个答案:

答案 0 :(得分:1)

Python getattr documentation:

  

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+,NaNmath包中可用作常量,因此可以使用obj.__dict__.get(feature_name, math.nan)