使用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 ('?','?')

顺便说一句,这可能是我放入类中的东西(例如,cardsetdeck),因此我可以将所有卡片处理代码收集到一个连贯的对象中。我将把它留给读者作为练习:-)

,

也许您可以创建几个字典来存储您想要的花色和等级的顺序,假设您知道这些卡片是有效的:

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')]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...