1

私の Rummy プログラムでは、カードが高い値から低い値 (K が最高、A が最低) で印刷されるように、出力を順序付けする必要があります。たとえば、次のようになります。

入力: 1. 8H、8C、8S、2C、7S、9H、KD

出力: 1. 8S、8H、8C、KD、9C、7H、2C

run4 = []
set4 = []
run3 = []
set3 = []
other = []
cards = input('1. ')
cards = cards.split(', ')
card_numbers_count = {'A':0, '2':0, '3':0, '4':0, '5':0, '6':0, '7':0, '8':0, '9':0, 'T':0, 'J':0, 'Q':0, 'K':0}
card_suit_count = {'H':0, 'D':0, 'S':0, 'C':0}

def card_suit_key(card):
    suit_vals = {'S': 1, 'H': 2, 'C': 3, 'D': 4}
    return suit_vals[card[1]]
def numerical_order(card):
    num_vals = {'K': 1, 'Q': 2, 'J': 3, 'T': 4, '9': 5, '8': 6, '7': 7, '6': 8, '5': 9, '4': 10, '3': 11, '2': 12, 'A': 13}
    return num_vals[card[1]]

# card value
for card in cards:
    card_number = card[:-1]
    card_numbers_count[card_number] += 1
for card in cards:
    card_number = card[:-1]
    if card_numbers_count[card_number] == 3:
        run3.append(card)
        run3.sort(key=card_suit_key)
    elif card_numbers_count[card_number] == 4:
        run4.append(card)
        run4.sort(key=card_suit_key)
    elif card_numbers_count[card_number] > 3 or card_numbers_count[card_number] < 3:
        other.append(card)
        print (other)
        #other.sort(key=numerical_order)
print (run4, run3, other)

# card suit
for card in cards:
    card_suit  = card[1:]
    card_suit_count[card_suit] += 1
for card in cards:
    card_suit  = card[1:]

スーツを最高から最低の順に並べることはできたので、質問を編集しましたが、カードの価値については同じことができません。どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

2

単純なルックアップ テーブルを介した並べ替えはかなり高速であり、以下に示すようにそのテーブルをデータ主導で作成すると、必要に応じて全体を簡単に変更できます。RANKSand/orの値を並べ替えるだけです。SUITS必要に応じてリストします。

from itertools import product

RANKS = 'A 2 3 4 5 6 7 8 9 10 J Q K'.split()  # low to high value
SUITS = 'S H C D'.split()  # high to low suit
DECK = list(''.join(it) for it in product(RANKS, SUITS))
LUT = dict((card, index) for index,card in enumerate(DECK))

hand = ['8H', '8C', '8S', '9C', '7S', '9H', 'KD']
print sorted(hand, key=LUT.get)

出力:

['7S', '8S', '8H', '8C', '9H', '9C', 'KD']
于 2013-04-07T18:46:29.347 に答える
2

例をどのように並べ替えているのかよくわかりませんが、カードをスーツ (スペード、ハート、クラブ、ダイヤモンド) で並べ替えたい場合は、カスタム キー関数を作成できます。次のように、各スーツの「重み」を辞書に保持できます。

編集:キー関数でタプルを返すことにより、両方の並べ替えを一度に実行できる簡略化されたバージョンを次に示します。

>>> cards = ['8H', '8C', '8S', '2C', '7S', '9H', 'KD']
>>>
>>> def card_suit_key(card):
...     suits = 'S H C D'.split()
...     ranks = 'K Q J 10 9 8 7 6 5 4 3 2 A'.split()
...     return (suits.index(card[-1]), ranks.index(card[:-1]))
...
>>> cards.sort(key=card_suit_key)
>>> cards
['8S', '7S', '9H', '8H', '8C', '2C', 'KD']
于 2013-04-07T17:50:42.813 に答える
1

正しい順序で一時的な配列/リストに保存してから、元の配列/リストにコピーして戻します。

于 2013-04-07T17:57:59.560 に答える