Python元组自然排序列表(纸牌游戏)
我正在开发一个基于文本的围捕游戏,作为练习/学习python的一种方式。我想对玩家手中的牌进行分类,以确保可读性,我遇到了一些问题Python元组自然排序列表(纸牌游戏),python,python-2.7,sorting,tuples,Python,Python 2.7,Sorting,Tuples,我正在开发一个基于文本的围捕游戏,作为练习/学习python的一种方式。我想对玩家手中的牌进行分类,以确保可读性,我遇到了一些问题 my_hand = [('3', 'Spades'), ('Ace', 'Hearts'), ('10', 'Clubs'), ('King', 'Diamonds'), ('4', 'Clubs')] 如果我这样做: my_hand.sort() 我得到: [('10', 'Clubs'), ('3', 'Spades'), ('4', 'Clubs'), (
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等等。这是一个很好的自定义比较器用例!比较器是排序算法用来比较两个项目的函数。如果ab,则返回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)
您希望如何对卡片进行准确排序?你能再具体一点吗?另外,请给出一些预期输出的示例。
hand.sort(key=lambda t:['2','3','4','5','6','7','8','9','10','Jack','Queen','King','Ace'].index(t[0])
为您的卡片提供一个包含int值的查找表,并按其值排序。像{'Ace':14,'King':13,'Queen':12….'2':2}这样的字典,然后使用当前卡作为键并按值排序。即使您在try
块中将int(卡[0])
转换为int
,下一行如果卡[0]!=10:
将始终是真的
因为卡[0]
仍然是
而且您没有保存演员阵容我的手。排序(key=lambda卡:dict([(str(i),i)表示范围(2,11)中的i)]+列表(zip(('Jack','Queen','King','Ace'),范围(11,15)))[card[0]
。您应该编写一个适当的sort helper函数,并将其作为参数传递给key
。