我正在开发一个基于文本的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先到先得。但是因为我有'王牌'王' '大号' '杰克'作为卡片值,我不能将其排序为int。
这就是我想出来的。但是我认为必须有一个更好的方法来实现它,这个项目的目标是学习新的方法,所以我可以问你。
我的解决方案:
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
思想?
答案 0 :(得分:0)
您可以做的是为卡片分配一个数字值,因为只有4张面牌。例如,说Ace = 1,Jack = 11,依此类推。
答案 1 :(得分:0)
这是自定义比较器的一个很好的用例!比较器是排序算法用于比较两个项目的函数。如果a< cmp(a,b)返回-1。 b,如果a == b则为0,如果a> a,则为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)