簡體   English   中英

Python自然排序元組列表(紙牌游戲)

[英]Python natural sort list of tuples (card game)

我正在開發一種基於文本的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位排名第一。 但是因為我有“ Ace”,“ King”,“ Queen”,“ Jack”作為卡值,所以無法將其作為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

思考?

您可以做的就是為您的卡分配一個數字值,因為只有4張面卡。 例如,說Ace = 1,Jack = 11,依此類推。

對於自定義比較器來說,這是一個很好的用例! 比較器是排序算法用來比較兩個項目的功能。 如果a <b,則cmp(a,b)返回-1,如果a == b,則返回0,如果a> b,則返回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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM