Python自然排序元组列表(纸牌游戏)

时间:2017-07-13 18:28:36

标签: python python-2.7 sorting tuples

我正在开发一个基于文本的Go Fish游戏,作为练习/学习python的一种方式。为了便于阅读,我想在玩家手中对牌进行排序,并遇到问题。

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先到先得。但是因为我有'王牌'王' '大号' '杰克'作为卡片值,我不能将其排序为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

思想?

2 个答案:

答案 0 :(得分:0)

您可以做的是为卡片分配一个数字值,因为只有4张面牌。例如,说Ace = 1,Jack = 11,依此类推。

答案 1 :(得分:0)

这是自定义比较器的一个很好的用例!比较器是排序算法用于比较两个项目的函数。如果a< cmp(a,b)返回-1。 b,如果a == b则为0,如果a> a,则为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)