7

リストのリストがあります:

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

これはカードの値であることに気付くかもしれません。つまり、C = クラブなどです。J = ジャックなどです。参照リストもあります。

>>> confrom = {'3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, \
... '0':10, 'J':11, 'Q':12, 'K':13, 'A':14, '2':15}

最大値が 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']]

現在、これは非常に単純な実装ですが、より複雑な方法でソートできるようにしたいと考えています。

4

2 に答える 2

10

これを試して:

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

イデオネ

于 2012-05-24T04:15:57.460 に答える
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

いくつかのカードを試してください:

c1=Card(2,'s')     
c2=Card(4,'d')

if c1>c2:
    print "A", c1, "beats a", c2
elif c2>c1:    
    print "A", c2, "beats a", c1
else:
    print "Same..."    

これは以下を出力します:

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 の書籍 How to Think Like a Computer Scientist: Learning with Python HEREを参照してください。

于 2012-05-24T05:46:35.390 に答える