Python元组的自然排序列表(纸牌游戏)



我正在开发一个基于文本的Go Fish游戏,作为练习/学习python的一种方式。我想对玩家手中的牌进行排序以提高可读性,但遇到了问题。

my_hand = [('3', 'Spades'), ('Ace', 'Hearts'), ('10', 'Clubs'), ('King', 'Diamonds'), ('4', 'Clubs')]

如果我这样做:

my_hand.sort()

我得到:

[('10', 'Clubs'), ('3', 'Spades'), ('4', 'Clubs'), ('Ace', 'Hearts'), ('King', 'Diamonds')]

我不希望10个排在第一位。但是因为我有"王牌"、"国王"、"女王"、"杰克"作为卡片值,所以我无法按整数排序。

这就是我想出的。但我认为必须有更好的方法来做到这一点,这个项目的目标是学习新方法,所以我会问。

我的解决方案:

def natural_sort(hand):
number_cards = []
ten_cards = []
face_cards = []
new_hand = []
for card in hand:
try:
int(card[0])
if card[0] != 10:
number_cards.append(card)
elif card[0] == 10:
ten_cards.append(card)
except ValueError:
face_cards.append(card)
number_cards.sort()
face_cards.sort()
new_hand.extend(number_cards)
new_hand.extend(ten_cards)
new_hand.extend(face_cards)
return new_hand

思潮?

您可以做的是为卡片分配一个数字值,因为只有 4 张面卡。例如,假设 Ace=1、Jack=11,依此类推。

这是自定义比较器的一个很好的用例!比较器是排序算法用来比较两个项目的函数。如果 a <b,则> b,则返回 1。

要获得所需的排序,您可以执行以下操作:

hand = [('10', 'Clubs'), ('3', 'Spades'), ('4', 'Clubs'), ('Ace', 'Hearts'), ('King', 'Diamonds')]
def card_cmp(card1, card2):
try:
c1num = int(card1[0])
except ValueError:
c1num = False
try:
c2num = int(card2[0])
except ValueError:
c2num = False
if c1num and c2num:
return cmp(c1num, c2num)
elif c1num:
return -1
elif c2num:
return 1
else:
return cmp(card1[0], card2[0])
print sorted(hand, cmp=card_cmp)

如果您还想按值而不是按字母顺序对面卡进行排序,则必须在某个地方对该顺序进行编码,也许使用字典,例如

face_cards = { 
'Jack' : 11,
'Queen' : 12,
'King' : 13,
'Ace' : 14,
}

然后你的比较器可能只是

def card_cmp(card1, card2):
try:
c1num = int(card1[0])
except ValueError:
c1num = face_cards[card1[0]]
try:
c2num = int(card2[0])
except ValueError:
c2num = face_cards[card2[0]]
return cmp(c1num, c2num)

最新更新