繁体   English   中英

如何根据字段的值对对象列表进行排序

[英]How to sort a list of objects based on the value of a field

我曾经有一个玩家的以下表示:

from dataclasses import dataclass
from pprint import pprint
from typing import Union

@dataclass
class Player:
    name: str
    club: str
    is_captain: bool
    is_vice_captain: bool

players = [
    Player("Desmond Bane",   "MEM", False, False),
    Player("Jaren Jackson",  "MEM", False,  True),
    Player("Steven Adams",   "MEM", False, False),
    Player("Ja Morant",      "MEM", True,  False),
    Player("Dillion Brooks", "MEM", False, False),
    ]

我可以很容易地按队长排序:

sorted_players = sorted(players, key=lambda x: (x.is_captain, x.is_vice_captain), reverse=True)
pprint(sorted_players)

[Player(name='Ja Morant', club='MEM', is_captain=True, is_vice_captain=False),
 Player(name='Jaren Jackson', club='MEM', is_captain=False, is_vice_captain=True),
 Player(name='Desmond Bane', club='MEM', is_captain=False, is_vice_captain=False),
 Player(name='Steven Adams', club='MEM', is_captain=False, is_vice_captain=False),
 Player(name='Dillion Brooks', club='MEM', is_captain=False, is_vice_captain=False)]

现在我将队长减少到一个领域:

Captain = 'cap'
Vice_captain = 'vice_cap'
Non_captain = None
Captaincy = Union[Captain, Vice_captain, Non_captain]

@dataclass
class Player2:
    name: str
    club: str
    captaincy: Captaincy

players2 = [
    Player2("Desmond Bane",   "MEM", Non_captain),
    Player2("Jaren Jackson",  "MEM", Vice_captain),
    Player2("Steven Adams",   "MEM", Non_captain),
    Player2("Ja Morant",      "MEM", Captain),
    Player2("Dillion Brooks", "MEM", Non_captain),
    ]

完成此操作后,我想知道如何对球员进行排序,以便队长先排,副队长排第二,然后是团队的 rest?

您可以使用dict对层次结构进行编码

values = {Captain:1, Vice_captain: 2}
sorted_players = sorted(players2, key=lambda x: values.get(x.captaincy, 3))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM