Python3-将数组按特定顺序排序

问题描述

我正在用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将其转换为所需顺序。

相关问答

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