Tengo una lista de objetos que se parece a esto.
hand = [ Card(10, 'H'), Card(2,'h'), Card(12,'h'), Card(13, 'h'), Card(14, 'h') ]Card(10, 'H) aquí no es una tupla, sino un objeto. Sé cómo ordenar esta lista si cada elemento de la lista estuviera en forma de tupla, así,
hand = sorted(hand, key = lambda x: x[0])pero no tengo idea de cómo ordenar una lista de objetos. Quiero ordenar mi lista por el primer valor de entrada, que es el número en Card()
¿Cómo puedo hacer esto?
Editar: Aquí está la definición de Card().
class Card(object): RANKS = (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) SUITS = ('C', 'D', 'H', 'S') def __init__(self, rank=12, suit='S'): if (rank in Card.RANKS): self.rank = rank else: self.rank = 12 if (suit in Card.SUITS): self.suit = suit.upper() else: self.suit = 'S' def __str__(self): if (self.rank == 14): rank = 'A' elif (self.rank == 13): rank = 'K' elif (self.rank == 12): rank = 'Q' elif (self.rank == 11): rank = 'J' else: rank = str(self.rank) return rank + self.suit def __eq__(self, other): return (self.rank == other.rank) def __ne__(self, other): return (self.rank != other.rank) def __lt__(self, other): return (self.rank < other.rank) def __le__(self, other): return (self.rank <= other.rank) def __gt__(self, other): return (self.rank > other.rank) def __ge__(self, other): return (self.rank >= other.rank)La idea sigue siendo la misma. Solo que buscará un atributo específico en el objeto de clase.
Para su clase de tarjeta, podría hacer algo como esto:
hand = [ Card(10, 'H'), Card(2,'h'), Card(12,'h'), Card(13, 'h'), Card(14, 'h') ]Entonces podrías hacer
sorted_cards = sorted(hand, key=lambda x: x.rank)La salida se parece a esto:
>>> [card.number for card in sorted_cards] [2, 10, 12, 13, 14]Este es el enfoque orientado a objetos. Como mínimo, debe especificar las operaciones __eq__ y __lt__ para que esto funcione. Luego solo usa sorted(hand) .
class Card(object): def __init__(self, rank, suit): self.rank = rank self.suit = suit def __eq__(self, other): return self.rank == other.rank and self.suit == other.suit def __lt__(self, other): return self.rank < other.rank hand = [Card(10, 'H'), Card(2, 'h'), Card(12, 'h'), Card(13, 'h'), Card(14, 'h')] hand_order = [c.rank for c in hand] # [10, 2, 12, 13, 14] hand_sorted = sorted(hand) hand_sorted_order = [c.rank for c in hand_sorted] # [2, 10, 12, 13, 14] Es una buena práctica hacer que la lógica de clasificación de objetos, si corresponde, sea una propiedad de la clase en lugar de incorporarla en cada instancia en la que se requiera la clasificación. De esta manera, puede llamar a sorted(list_of_objects) cada vez.