Python中如何按职务排序

2024-06-07 04:51:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为Shareholder的类,每个Shareholder可以有4个职位中的一个:总裁、副总裁、秘书或财务主管(按顺序排列)。在

我想按职务对股东名单进行排序,但我不知道该怎么做,只能让这个可怕的cmp功能变成这样:

def shareholder_title_sort(s1, s2):
    if s1.is_president: return -1
    elif s2.is_president: return 1
    elif s1.is_vice_president: return -1
    elif s2.is_vice_president: return 1
    elif s1.is_secretary: return -1
    elif s2.is_secretary: return 1
    elif s1.is_treasurer: return -1
    elif s2.is_treasurer: return 1
    else: return 0

像这样使用它:

^{pr2}$

以下是Shareholder类:

^{3}$

在Python2中,有什么更优雅的方法来实现这一点?在


Tags: returnisvice职位s2elifs1president
2条回答

下面所示的解决方案可能会有所帮助。答案代码中的目标是使对象可以排序,而不需要键。根据所使用的排序机制,可能需要其他比较运算符。在

TITLES = {'President': 'P', 'Vice President': 'V',
          'Secretary': 'S', 'Treasurer': 'T'}
CHOICES = tuple((b, a) for a, b in TITLES.items())


class Shareholder(AuditModel):

    name = models.CharField(max_length=255)
    primary_title = models.CharField(max_length=1, choices=CHOICES)
    secondary_title = models.CharField(max_length=1, choices=CHOICES)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    @property
    def is_president(self):
        return self.__has_title('President')

    @property
    def is_vice_president(self):
        return self.__has_title('Vice President')

    @property
    def is_secretary(self):
        return self.__has_title('Secretary')

    @property
    def is_treasurer(self):
        return self.__has_title('Treasurer')

    def __has_title(self, title):
        return TITLES[title] in {self.primary_title, self.secondary_title}

    def __lt__(self, other):
        return self.__order < other.__order

    @property
    def __order(self):
        if self.is_president:
            return 0
        if self.is_vice_president:
            return 1
        if self.is_secretary:
            return 2
        if self.is_treasurer:
            return 3
        return 4

将类型映射到数字,在key排序中使用:

def sort_by_role(s):
    if s.is_president: return 0
    if s.is_vice_president: return 1
    if s.is_secretary: return 2
    if s.is_treasurer: return 3
    return 4  # sort the rest at the end.

sorted(shareholders, key=sort_by_role)

如果存在“role”属性,则可以在字典映射中使用该属性,但是:

^{pr2}$

字典理解产生了一个从排名字母到索引的映射(因此P映射到0)。best_role根据股东的主要或次要角色,找到股东的“最高”排名(最低指数)。在

这假定您的SHAREHOLDER_TITLE序列是按优先顺序排序的。如果没有,只需生成一个手动映射;例如{'P': 0, 'V': 1, 'S': 2, 'T': 3}。在

相关问题 更多 >