我有两个列表:
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']
