如何解决使用python根据其套件和值对卡片进行排序
有人可以帮我按套房和 vules 对卡片进行分类吗? 我有:
[('♥','7'),('♥','9'),'10'),'J'),('♦','J')]
我需要得到:
return list_cards.sort(key=lambda c: (NAME_TO_VALUE[c[0]],c[1]))
return sorted(list_cards,key=lambda c: (NAME_TO_VALUE[c[0]],c[1]))
return sorted(list_cards)
我试过这样的方法:
NOMINALS = ['7','8','9','10','J','Q','K','A']
NAME_TO_VALUE = {n: i for i,n in enumerate(NOMINALS)} -> :<class 'dict'>: {'7': 0,'8': 1,'9': 2,'10': 3,'J': 4,'Q': 5,'K': 6,'A': 7}
list_cards = [('♥','10')]
def sort_hand():
# return list_cards.sort(key=lambda c: (NAME_TO_VALUE[c[0]],c[1]))
# return sorted(list_cards,c[1]))
return sorted(list_cards)
等等...
但结果与我想要的不同。 完整代码如下:
{{1}}
解决方法
一种方法是简单地使用辅助函数将卡片与序数位置相互转换,然后使用这些序数位置进行排序。
例如:
# These decide sort order,change if different order needed.
suitMap = ['♠','♣','♦','♥']
faceMap = ['2','3','4','5','6','7','8','9','10','J','Q','K','A']
def cardToOrd(cardVal):
return 13 * suitMap.index(cardVal[0]) + faceMap.index(cardVal[1])
def ordToCard(ordVal):
return (suitMap[ordVal // 13],faceMap[ordVal % 13])
def sortCards(cardList):
newList = [cardToOrd(i) for i in cardList]
newList.sort()
return [ordToCard(i) for i in newList]
cards = [('♥','9'),('♥','J'),('♦','7'),'10'),'10')]
print(cards)
print(sortCards(cards))
如果有可能使用无效卡,您可以使其更加强大。如下更改序数转换函数将强制无效卡片为 ('?','?')
并将它们放在最后:
def cardToOrd(cardVal):
try:
return 13 * suitMap.index(cardVal[0]) + faceMap.index(cardVal[1])
except:
return 99999
def ordToCard(ordVal):
try:
return (suitMap[ordVal // 13],faceMap[ordVal % 13])
except:
return ('?','?')
顺便说一句,这可能是我放入类中的东西(例如,cardset
或 deck
),因此我可以将所有卡片处理代码收集到一个连贯的对象中。我将把它留给读者作为练习:-)
也许您可以创建几个字典来存储您想要的花色和等级的顺序,假设您知道这些卡片是有效的:
SUITS = ['♥','♠','♣']
RANKS = ['2','A']
SUIT_ORDER = {suit: order for order,suit in enumerate(SUITS)}
RANK_ORDER = {rank: order for order,rank in enumerate(RANKS)}
list_cards = [('♥',('♠','6'),('♣','A')]
sorted_list_cards = sorted(list_cards,key=lambda c: (SUIT_ORDER[c[0]],RANK_ORDER[c[1]]))
print(sorted_list_cards)
输出:
[('♥','A'),'6')]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。