You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用仅含单循环的通用方法按纸牌游戏规则排序数组?

扑克牌排序问题

输入

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:10:28