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

Python元组自然排序列表(纸牌游戏),python,python-2.7,sorting,tuples,Python,Python 2.7,Sorting,Tuples,我正在开发一个基于文本的围捕游戏,作为练习/学习python的一种方式。我想对玩家手中的牌进行分类,以确保可读性,我遇到了一些问题 my_hand = [('3', 'Spades'), ('Ace', 'Hearts'), ('10', 'Clubs'), ('King', 'Diamonds'), ('4', 'Clubs')] 如果我这样做: my_hand.sort() 我得到: [('10', 'Clubs'), ('3', 'Spades'), ('4', 'Clubs'), (

我正在开发一个基于文本的围捕游戏,作为练习/学习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等等。

这是一个很好的自定义比较器用例!比较器是排序算法用来比较两个项目的函数。如果ab,则返回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)

您希望如何对卡片进行准确排序?你能再具体一点吗?另外,请给出一些预期输出的示例。
hand.sort(key=lambda t:['2','3','4','5','6','7','8','9','10','Jack','Queen','King','Ace'].index(t[0])
为您的卡片提供一个包含int值的查找表,并按其值排序。像{'Ace':14,'King':13,'Queen':12….'2':2}这样的字典,然后使用当前卡作为键并按值排序。即使您在
try
块中将
int(卡[0])
转换为
int
,下一行
如果卡[0]!=10:
将始终是
真的
因为
卡[0]
仍然是
而且您没有保存演员阵容
我的手。排序(key=lambda卡:dict([(str(i),i)表示范围(2,11)中的i)]+列表(zip(('Jack','Queen','King','Ace'),范围(11,15)))[card[0]
。您应该编写一个适当的sort helper函数,并将其作为参数传递给
key