Python按简单的枚举类似

时间:2016-08-04 11:25:33

标签: python python-2.7 sorting enums

我想让用户操纵一个(不是很大的,~800个数据行)数据集合,并让他们像在Excel上那样应用过滤器/排序。

我正在从csv读取数据,具有以下结构

Program | Mesh | Degree | Proc | Min | Max | Average | Status
-------------------------------------------------------------
'prog1' | 4x4x4| 2x2x2  | 2x1x1| 3.52| 3.8 | 3.72    | 'ok'
'prog2' | 8x4x4| 2x2x2  | 2x2x1| 3.60| 3.9 | 3.80    | 'Warning...'

假设我已经过滤了我的列表,我需要按'Proc'排序,我该怎么做? proc列实际上是类似枚举值的“字符串”

'1x1x1' < '2x1x1' < '2x2x1' < ... < '64x64x64' (powers of 2)

没有那么多“枚举”值,但我仍然觉得没有切换......我想也许我实际上可以将它们转换为整数(通过执行乘法),但后来我失去了“标签“(在我的图表中,我想显示”axbxc“)

我的首要目标是定义一个顶级函数“sort_data”,其中一个可以提供任意数量的列标题作为参数,程序应该相应地排序

例如

sort_data('proc') # => Sort data per Proc column (axbxc values)
sort_data('proc', 'mesh') # => Sort data per proc and then by mesh (axbxc)

由于数据集不是很大而且非实时计算,我更倾向于使用可读解决方案而不是效率(性能明智)

编辑:对于过滤,我有类似的东西

def filter_program:
  self.filtered = [sample for sample in self.data_pointer if sample.program == program]

# similar for all columns, except the `if` clause gets more complicated
# (I have the code, no problem on those ones)

def filter(self, filter_dict):
    """Execute several filters."""
    for header, value in filter_dict.iteritems():
        if header in self.headers():
            getattr(self, 'filter_'+header)(value)
            self.active_filters[header] = value
        else:
            print('ERROR : unknown filter ' + column + ' (previous filters applied)')
    return self.filtered

编写过滤器方法很简单,因为我们可以一个接一个地应用过滤器。对于排序它有点复杂,因为我们想要将一个元组传递给sort方法(按元组[0]然后按元组[1] ...排序),并且那些排序函数需要能够对维度进行排序' 1x1x1'等。)

def sort(self, sort_dict):
  for header, value in sort_dict.iteritems():
    if !(header in self.headers()):
      # error
      return
  self.sorted = sorted(self.filtered, key=lambda row: (### ??? ###)

排序key lambda的代码必须是一个元组,它考虑了sort_dict的所有排序标准。如果我想按最小/平均排序,我会做

# sort_order = ['min', 'max']
sorted(self.filtered, key=lambda row: (float(row.min), float(row.max))

示例用法是:

sort_order([
  'mesh' # 1x1x1 then 2x1x1 then 2x2x1 ...
  'program' # 'alphabetical': prog1 then prog2 ...
})

0 个答案:

没有答案