Eri*_*Kim 2 python sorting object python-3.x
我有一个看起来像这样的对象列表.
hand = [ Card(10, 'H'), Card(2,'h'), Card(12,'h'), Card(13, 'h'), Card(14, 'h') ]
Run Code Online (Sandbox Code Playgroud)
卡(10,'H)在这里不是元组,而是一个对象.我知道如果列表中的每个项目都是元组形式,如此排序,如何对此列表进行排序,
hand = sorted(hand, key = lambda x: x[0])
Run Code Online (Sandbox Code Playgroud)
但我不知道如何对对象列表进行排序.我想按第一个输入值排序我的列表,这是Card()中的数字
我怎样才能做到这一点?
编辑:这是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)
Run Code Online (Sandbox Code Playgroud)
kar*_*ikr 11
这个想法仍然是一样的.只是你将在类对象中寻找一个特定的属性.
对于您的卡类,您可以执行以下操作:
hand = [ Card(10, 'H'), Card(2,'h'), Card(12,'h'), Card(13, 'h'), Card(14, 'h') ]
Run Code Online (Sandbox Code Playgroud)
然后你可以做到
sorted_cards = sorted(hand, key=lambda x: x.rank)
Run Code Online (Sandbox Code Playgroud)
输出看起来像这样:
>>> [card.number for card in sorted_cards]
[2, 10, 12, 13, 14]
Run Code Online (Sandbox Code Playgroud)
这是面向对象的方法.至少,您应该为此指定__eq__和__lt__操作.然后就用吧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]
Run Code Online (Sandbox Code Playgroud)
最好的做法是使对象排序逻辑(如果适用)成为类的属性,而不是在每个实例中包含所需的顺序.这样你sorted(list_of_objects)每次都可以打电话.
| 归档时间: |
|
| 查看次数: |
5990 次 |
| 最近记录: |