按长度和值对列表进行排序

2024-09-29 23:22:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一份清单:

>>> a = [['3D'], ['3D', '4D', '5D'], ['4C'], ['2C'],['4C', '4D'], ['4D'], ['5D'], \
... ['JC'], ['JC', 'JS'], ['JS']]

您可能会注意到这是卡值,即C=梅花等。J=杰克等。我还有一个参考列表:

^{pr2}$

因为我在玩一个最大值是2的纸牌游戏。要按列表长度排序,我需要:

>>> a = sorted(a, key = lambda x: len(x))
>>> a
... [['3D'], ['4C'], ['4D'], ['2C'], ['5D'], ['JC'], ['JS'], ['4C', '4D'], ['JC', 'JS'], ['3D', '4D', '5D']]

我还需要根据字典值对它们进行排序,这样我得到的列表将是:

>>> [['3D'], ['4C'], ['4D'], ['5D'], ['JC'], ['JS'], ['2C'], ['4C', '4D'], ['JC', 'JS'], ['3D', '4D', '5D']]

目前这是一个相当简单的实现,但我希望能够以更复杂的方式对其进行排序。在


Tags: lambdakey游戏列表len字典排序方式
2条回答

这可能是一个很好的例子,说明何时从Python中的基本数据结构转换到类。在

考虑:

values = ('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A')
suits = ('H', 'C', 'D', 'S')
sRep = {'H':'Hearts', 'C':'Clubs', 'D':'Diamonds', 'S':'Spades'}
ranks = {'2':15, '3':3, '4':4,'5':5,'6':6,'7':7,'8':8,
         '9':9, '0':10, '0':10, 'J':11, 'Q':12, 'K':13, 'A':14 }

class Card:
    def __init__(self, value, suit):
        value=str(value)
        self.value, self.suit = value.upper(), suit.upper()
        self.rSuit = sRep[suit.upper()]
        self.rank = ranks[value.upper()]

    def __repr__(self):
        return "%s of %s" % (self.value, self.rSuit)

    def __cmp__(self,other):
        if self.rank > other.rank: return 1
        if self.rank < other.rank: return -1    
        if self.value > other.value: return 1
        if self.value < other.value: return -1
        if self.rSuit > other.rSuit: return 1
        if self.rSuit < other.rSuit: return -1
        return 0

尝试一些卡片:

^{pr2}$

打印:

A 2 of Spades beats a 4 of Diamonds

因为我们在类中定义了一个排序顺序,所以复杂的排序很容易,基于不同游戏的排名也很容易。在

以您的名片列表为例:

a = [['3D'], ['3D', '4D', '5D'], ['4C'], ['2C'],['4C', '4D'], ['4D'], ['5D'], ['JC'], ['JC', 'JS'], ['JS']]  

print sorted([Card(c[0],c[1]) for e in a for c in e])

印刷品:

[3 of Diamonds, 3 of Diamonds, 4 of Clubs, 4 of Clubs, 4 of Diamonds, 
 4 of Diamonds, 4 of Diamonds, 5 of Diamonds, 5 of Diamonds, J of Clubs, 
 J of Clubs, J of Spades, J of Spades, 2 of Clubs]

再做一点工作,你就可以定义手和什么手胜过另一只手。在

您可以在经典的Python书籍《如何像计算机科学家一样思考:使用Python学习HERE中阅读更多关于这个例子的内容

试试这个:

sorted(a, key = lambda x: (len(x), [confrom[card[0]] for card in x]))

ideone

相关问题 更多 >

    热门问题