我的课程如下:

class Member:
  def __init__(self, name, zip, hire_date, birth_date):
    self.id = id
    self.name = name
    self.zip = zip
    self.hire_date = hire_date
    self.birth_date = birth_date

  def get_name(self):
    return self.name

  def get_birth_date(self):
    return self.birth_date

  def get_hire_date(self):
    return self.hire_date

  def get_zip_code(self):
    return self.zip

我需要根据邮政编码、姓名、出生日期和雇用日期对此类对象的列表进行快速排序.我可以使用单独的排序方法来实现这些.例如,按邮政编码快速排序:

def partition(array, begin, end):
    pivot = begin
    for i in range(begin+1, end+1):
        if array[i].get_zip_code() <= array[begin].get_zip_code():
            pivot += 1
            array[i], array[pivot] = array[pivot], array[i]
    array[pivot], array[begin] = array[begin], array[pivot]
    return pivot



def quicksort(array, begin=0, end=None):
    if end is None:
        end = len(array) - 1
    def _quicksort(array, begin, end):
        if begin >= end:
            return
        pivot = partition(array, begin, end)
        _quicksort(array, begin, pivot-1)
        _quicksort(array, pivot+1, end)
    return _quicksort(array, begin, end)

这很好用.但是现在我如何使相同的方法在所有属性上工作;理想情况下,通过向quicksort()传递一个附加参数来定义要排序的属性.我还希望不直接调用对象属性,而是使用getter方法.

这是按邮政编码排序后的输出

Name    Zip Hire Date   Birth Date
Cosmo Kramer 111-222 2019-06-01 1979-08-12
George Costanza 131-212 2016-06-01 1980-08-12
Jerry Seinfeld 223-212 2017-06-01 1981-06-15
John Wayne 323-212 2018-06-01 1962-06-17

推荐答案

可以通过在类中定义另一个方法来实现这一点:

class Metric:
    b_date = "birth_date"
    h_date = "hire_date"
    zip_code = "zip_code"
    name = "name"


class Member:
    def __init__(self, name, zip, hire_date, birth_date):
        self.id = id
        self.name = name
        self.zip = zip
        self.hire_date = hire_date
        self.birth_date = birth_date

    def get_name(self):
        return self.name

    def get_birth_date(self):
        return self.birth_date

    def get_hire_date(self):
        return self.hire_date

    def get_zip_code(self):
        return self.zip

    def get_metric_value(self, metric):
        if metric == Metric.b_date:
            return self.get_birth_date()
        elif metric == Metric.h_date:
            return self.get_hire_date()
        elif metric == Metric.zip_code:
            return self.get_zip_code()
        elif metric == Metric.name:
            return self.get_name()

def partition(array, begin, end, metric):
    pivot = begin
    for i in range(begin+1, end+1):
        if array[i].get_metric_value(metric) <= array[begin].get_metric_value(metric):
            pivot += 1
            array[i], array[pivot] = array[pivot], array[i]
    array[pivot], array[begin] = array[begin], array[pivot]
    return pivot

def quicksort(array, metric, begin=0, end=None):
    if end is None:
        end = len(array) - 1
    def _quicksort(array, begin, end):
        if begin >= end:
            return
        pivot = partition(array, begin, end, metric)
        _quicksort(array, begin, pivot-1)
        _quicksort(array, pivot+1, end)
    return _quicksort(array, begin, end)

quicksort(array, Metric.zip_code)  # or any other metric ...

Python相关问答推荐

如何找到满足各组口罩条件的第一行?

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

Python解析整数格式说明符的规则?

Stacked bar chart from billrame

移动条情节旁边的半小提琴情节在海运

在Python中,从给定范围内的数组中提取索引组列表的更有效方法

UNIQUE约束失败:customuser. username

Python Pandas获取层次路径直到顶层管理

在Python中从嵌套的for循环中获取插值

Cython无法识别Numpy类型

从源代码显示不同的输出(机器学习)(Python)

如何过滤组s最大和最小行使用`transform`'

我什么时候应该使用帆布和标签?

为什么后跟inplace方法的`.rename(Columns={';b';:';b';},Copy=False)`没有更新原始数据帧?

我如何处理超类和子类的情况

递归链表反转与打印语句挂起

合并Pandas中的数据帧,但处理不存在的列

是否将列表分割为2?

如何将ManyToManyfield用于Self类

401使用有效的OAuth令牌向Google Apps脚本Web App发出POST请求时出现未经授权的错误(";