2013-04-07 68 views
1

以我拉米程序我必须订购输出,使得卡片上都印有高到低的值(K为最高,A为最低) 例如:Python:如何编辑数组中元素的顺序?

输入: 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:] 

我已经编辑了问题,因为我是能够做到它从最高到最低订购西装,但我不能为卡的价值做同样的事情。任何帮助,将不胜感激。谢谢。

+2

你的意思'list'代替? – 2013-04-07 16:50:31

+3

到目前为止您有任何代码吗? – 2013-04-07 17:25:30

+0

此外,你可能想在这里寻找解决方案:http://stackoverflow.com/questions/10645986/custom-sort-python – 2013-04-07 17:36:21

回答

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'] 
+0

非常感谢你:)这真的很有帮助。 – zara 2013-04-07 18:43:54

+0

我试着用同样的技术将'2C','7S','9H,'KD'分为'KD','9H,'7S','2C'。我并不是想扭转秩序,我试图将剩下的牌从高到低排列(K是最高的,A是最低的),但它似乎不起作用D: – zara 2013-04-07 19:49:02

+0

@ Iccream看到我修改后的答案。希望它能解决这个问题。 – Nitzle 2013-04-07 20:37:22

1

按照正确的顺序将其存储在临时数组/列表中,然后将其复制回原始数组/列表。

2

通过一个简单的查找表进行排序会非常快,如果您创建了该表的数据驱动,如下所示,在必要时整个事情将非常容易更改 - 只需重新排序根据需要列出RANKS和/或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'] 
+1

也可以使用'key = LUT.get' – 2013-04-08 01:41:00

+0

'''LUT = dict((card,idx)for idx,card in enumerate(DECK))'更有效一些。 DECK可以通过列表理解来创建 – 2013-04-08 01:43:52

+0

@gnibbler:这两点都很好,谢谢,虽然第二个优化初始化,希望只做一次(但它也更清楚)。 – martineau 2013-04-08 01:55:38