如何用仅含单循环的通用方法按纸牌游戏规则排序数组?
扑克牌排序问题
输入
cards = ['Jack', 8, 2, 6, 'King', 5, 3, 'Queen', "Jack", "Queen", "King"]
期望输出
[2,3,5,6,8,'Jack','Queen','King']
原解法及问题
我使用以下方法完成了排序,但该方案并非仅含单循环的解法。请问是否有其他可行方案?
a= ['Jack', 8, 2, 6, 'King', 5, 3, 'Queen','King','Jack','Queen'] for i in range(len(a)): if a[i]=='Jack': a[i]=11 elif a[i]=='Queen': a[i]=12 elif a[i]=='King': a[i]=13 a.sort()
可行方案
方案一:利用sorted()的key参数(推荐)
这个方法无需提前转换所有元素,直接在排序阶段为每个牌面指定排序权重,同时完成去重和排序,代码简洁且不修改原数组:
cards = ['Jack', 8, 2, 6, 'King', 5, 3, 'Queen', "Jack", "Queen", "King"] # 定义花牌对应的排序权重 rank_map = {'Jack': 11, 'Queen': 12, 'King': 13} # 先去重,再按权重排序 sorted_cards = sorted(list(set(cards)), key=lambda x: rank_map.get(x, x)) print(sorted_cards)
输出结果:
[2, 3, 5, 6, 8, 'Jack', 'Queen', 'King']
说明:
set(cards)自动去除重复牌面,再转成列表用于排序key=lambda x: rank_map.get(x, x)表示:如果是花牌,取对应的权重数字;如果是数字牌,直接用自身数值作为排序依据,这样就能实现期望的排序顺序。
方案二:单循环去重 + 自定义选择排序
如果需要严格控制循环逻辑,可以先通过单循环去重,再用选择排序(排序算法的标准实现结构)完成排序:
cards = ['Jack', 8, 2, 6, 'King', 5, 3, 'Queen', "Jack", "Queen", "King"] rank_map = {'Jack': 11, 'Queen': 12, 'King': 13} # 单循环去重 unique_cards = [] for card in cards: if card not in unique_cards: unique_cards.append(card) # 选择排序 n = len(unique_cards) for i in range(n): min_index = i # 找到当前未排序部分的最小元素索引 for j in range(i + 1, n): val_current = rank_map.get(unique_cards[j], unique_cards[j]) val_min = rank_map.get(unique_cards[min_index], unique_cards[min_index]) if val_current < val_min: min_index = j # 交换当前位置和最小元素位置 unique_cards[i], unique_cards[min_index] = unique_cards[min_index], unique_cards[i] print(unique_cards)
输出结果与方案一一致。
内容的提问来源于stack exchange,提问作者Lord_0069
相关产品推荐
相关产品推荐

