Skip to main content
 首页 » 编程设计

python之卡片排序列表

2025年05月04日10duanxz

我有两个列表:

card_candidates = ['9D', '9S', '3S', '0D'] 
card_order = ['2', '3', '4', '5', '6', '7', '8', '9', '0', 'J', 'Q', 'K', 'A'] 

我希望能够根据第二个列表的顺序对第一个列表进行排序。所以排序后的 card_candidates 应该是这样的:

sorted_candidates = ['3S', '9D', '9S', '0D'] 

'0' 就是 10 的值,只是想让所有的卡片长度相同。如果出现平局,例如“9D”和“9S”,则需要对字母进行排序。到目前为止,我只是这样做了:

sorted_candidates = [] 
for x, y in zip(card_candidates, card_order): 
    sorted_candidates.append([x[0] for x in card_candidates]) 
return sorted(sorted_candidates) 

我知道这离正确还差得很远,我只是不知道该怎么做。

请您参考如下方法:

生成一个字典,将您的排序顺序字符映射到一个数字,我们将按这些进行排序:

sort_map = {c: i for i, c in enumerate(card_order)} 

您现在可以使用此映射对您的卡片进行排序,包括打破平局的第二个字母:

sorted_candidates = sorted(card_candidates, 
                           key=lambda card: (sort_map[card[0]], card[1])) 

排序键获取每张卡片的第一个字符,并将其转换为 sort_map 字典中的整数,然后通知 sorted() 函数正确排序命令。在平局(相同的牌值)的情况下,牌按梅花、方 block 、红心、黑桃顺序排序(假设您使用 C 和 H 表示梅花和红心)。

预先创建映射使排序保持在 O(NlogN) 时间复杂度内;您可以对 card_order.index(card[0]) 执行相同的操作,但随后您会调用 list.index() 调用每个已排序的元素,list.index 需要扫描列表,生成 O(KNlogN) 排序(其中 K 是 card_order 列表的长度)。

演示:

>>> card_candidates = ['9D', '9S', '3S', '0D'] 
>>> card_order = ['2', '3', '4', '5', '6', '7', '8', '9', '0', 'J', 'Q', 'K', 'A'] 
>>> sort_map = {c: i for i, c in enumerate(card_order)} 
>>> sorted(card_candidates, key=lambda card: (sort_map[card[0]], card[1])) 
['3S', '9D', '9S', '0D'] 
>>> sorted(['9D', '9S', '9C', '9H'], key=lambda card: (sort_map[card[0]], card[1])) 
['9C', '9D', '9H', '9S']