问题描述
我正在用Python 3写一个纸牌游戏(卡拉什尼科夫),我想对玩家的手进行排序。是否可以使用一种字典对手进行排序,以便重要卡片的顺序正确?我不知道会使用哪种方法。
游戏的目的是在4张牌中获得A,K,4和7,因此我需要按照以下顺序将手中的牌排成一列:
- A
- K
- 4
- 7
- [其他]
例如,如果原始手牌是3,K,7、2,则排序后的样子是:
- K
- 7
- 3
- 2 或:
- K
- 7
- 2
- 3
deck = shuffle()
print("Dealing",end="",flush=True)
for i in range(4):
print(".",end="")
if player == 1:
hand.append(deck.pop())
oppHand.append(deck.pop())
else:
oppHand.append(deck.pop())
hand.append(deck.pop())
sleep(1.25)
hand = sortHand(hand)
oppHand = sortHand(oppHand)
print(" [DONE]")
函数sortHand(hand)
应该是什么?
解决方法
是否可以使用一种字典对手进行排序,以便重要卡片的顺序正确?我不知道会使用哪种方法。
Python的sorted
内置函数(以及list.sort
方法)具有一个key
参数,这是您在这里需要的:key
是一个可转换的函数将值放入用于排序的“等级”中,例如如果您为“ A”返回0,为“ K”返回1,则“ A”将在“ K”之前排序。
您可以只定义等级的字典,然后将其用作键:
import collections
ranks = collections.defaultdict(lambda: 5,{
'A': 0,'K': 1,'4': 3,'7': 4,})
hand = list('3K72')
print('before',','.join(hand))
# => before 3,K,7,2
hand.sort(key=lambda card: ranks[card])
print(' after','.join(hand))
# => after K,3,2
,
实际上,您可以通过可选的key变量来利用标准的lib排序功能:
def priority(element):
if element == 'A':
return -4
if element == 'K':
return -3
if element == '4':
return -2
if element == '7':
return -1
return ord( element )
print(sorted(['1','4','K','7'],key=priority))
,
简短的一个:hand.sort(key='74KA'.find,reverse=True)
请注意,如果找不到该值,find
将返回-1
,因此它将字符A,K,4、7映射到(索引)3、2、1、0和所有其他-1。这与所需顺序相反,因此reverse=True
将其转换为所需顺序。