我有两个清单:
card_candidates = ['9D', '9S', '3S', '0D']
card_order = ['2', '3', '4', '5', '6', '7', '8', '9', '0', 'J', 'Q', 'K', 'A']
Run Code Online (Sandbox Code Playgroud)
我希望能够根据第二个列表顺序对第一个列表进行排序.所以排序后的card_candidates应如下所示:
sorted_candidates = ['3S', '9D', '9S', '0D']
Run Code Online (Sandbox Code Playgroud)
'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)
Run Code Online (Sandbox Code Playgroud)
我知道这甚至不是正确的,我只是不知道该怎么做.
Mar*_*ers 10
生成将排序顺序字符映射到数字的字典,我们将按以下顺序排序:
sort_map = {c: i for i, c in enumerate(card_order)}
Run Code Online (Sandbox Code Playgroud)
您现在可以使用此映射对卡片进行排序,包括断开连接的第二个字母:
sorted_candidates = sorted(card_candidates,
key=lambda card: (sort_map[card[0]], card[1]))
Run Code Online (Sandbox Code Playgroud)
排序键获取每张卡的第一个字符,并将其转换为sort_map字典中的整数,然后通知sorted()函数正确的排序顺序.如果是领带(卡片价值相等),卡片将按照俱乐部,钻石,心形,黑桃的顺序排序(假设您使用,C并H为俱乐部和心脏使用).
预先创建映射将排序保持在O(NlogN)时间复杂度内; 您也可以这样做card_order.index(card[0]),但随后您调用每个已排序元素的list.index()调用,并需要扫描列表,生成O(KNlogN)排序(其中K是列表的长度).list.indexcard_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']
Run Code Online (Sandbox Code Playgroud)