【问题标题】:Build a dictionary of selected features构建所选特征的字典
【发布时间】:2018-08-19 16:53:38
【问题描述】:

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

【问题讨论】:

    标签: python dictionary missing-features


    【解决方案1】:

    你可以使用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】:

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

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

      【讨论】:

        【解决方案3】:

        Python getattr documentation:

        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}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-05-18
          • 1970-01-01
          • 2017-12-05
          • 2016-10-11
          • 1970-01-01
          • 2012-12-19
          • 1970-01-01
          相关资源
          最近更新 更多