【问题标题】:Python: How to edit the order of elements in an array?Python:如何编辑数组中元素的顺序?
【发布时间】:2013-03-29 16:49:56
【问题描述】:

在我的 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:]

我已经编辑了这个问题,因为我可以将花色从最高到最低排序,但我不能对卡片价值做同样的事情。任何帮助,将不胜感激。谢谢。

【问题讨论】:

标签: python arrays python-3.x element


【解决方案1】:

我不太确定您是如何对示例进行排序的,但如果您想按花色(黑桃、红心、梅花、方块)对卡片进行排序,您可以创建自定义键功能。您可以像这样在字典中保存每件西装的“重量”:

编辑:这是一个简化版本,可以同时进行两种排序,方法是在键函数中返回一个元组:

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

【讨论】:

  • 非常感谢 :) 这真的很有帮助。
  • 我尝试使用相同的技术进行排序:'2C'、'7S'、'9H、'KD' 到 'KD'、'9H、'7S'、'2C'。我不是试图颠倒顺序,我试图将剩余的卡从最高到最低排序(K 是最高的,A 是最低的)但它似乎不起作用 D:
  • @Icecream 查看我修改后的答案。希望它能解决问题。
  • @Icecream 另请注意,我将键功能更改为使用card[-1],以便它可以正确处理“10”卡,而二次排序则使用x[:-1] 来代替。
  • 考虑让你的键函数返回一个tuple。然后,您可以一步完成排序。
【解决方案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']

【讨论】:

  • 也可以只用key=LUT.get
  • LUT = dict((card, idx) for idx, card in enumerate(DECK)) 效率更高一些。 DECK 可以通过列表理解创建
  • @gnibbler:两点都很好,谢谢,虽然第二点是优化初始化,希望只进行一次(但也更清楚)。
  • @gnibbler:将key=lambda card: LUT[card] 更改为key=LUT.get 的一个微妙的副作用是它会导致无效的卡名被静默忽略,而不是引发KeyError
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2019-09-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    相关资源
    最近更新 更多