[英]Python natural sort list of tuples (card game)
我正在開發一種基於文本的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位排名第一。 但是因為我有“ Ace”,“ King”,“ Queen”,“ Jack”作為卡值,所以無法將其作為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
思考?
您可以做的就是為您的卡分配一個數字值,因為只有4張面卡。 例如,說Ace = 1,Jack = 11,依此類推。
對於自定義比較器來說,這是一個很好的用例! 比較器是排序算法用來比較兩個項目的功能。 如果a <b,則cmp(a,b)返回-1,如果a == b,則返回0,如果a> 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.