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

为什么Python的sort()函数无法对列表中的数值正确排序?

排序错误的根本原因

你调用sort()时对牌面值执行的是字符串字典序排序,而非数值排序:

  • Python默认的列表排序规则下,字符串类型的数字会逐字符比较Unicode编码值,'1'的编码远小于'8'、'9',因此所有以'1'开头的面值字符串('10'、'11'、'12'、'13')都会整体排在'8'、'9'前面,和数值大小的排序逻辑完全不符,就出现了你看到的错误顺序。
修复方案

不需要修改你现有的面值转换逻辑,只要给sort()方法指定排序key,将面值临时转为整数做排序依据即可:

# 把原来的 deck.sort() 替换为下面的代码
deck.sort(key=lambda item: (int(item[0]), item[1]))

这个key规则会先按牌面值的数值升序排列,相同面值的牌再按花色的字符串顺序排列,完全符合扑克牌排序的预期。

修正后完整可运行代码
import random

# Initialize Deck
deck = []
suits = ['Club', 'Spade', 'Heart', 'Diamond']

for i in range(8, 14):
    for s in range(4):
        deck.append([str(i), suits[s]])

# Format numbers into card face
for i in range(len(deck)):
    if deck[i][0] == "1":
        deck[i][0] = "Ace"
    elif deck[i][0] == "11":
        deck[i][0] = "J"
    elif deck[i][0] == "12":
        deck[i][0] = "Q"
    elif deck[i][0] == "13":
        deck[i][0] = "K"

print("Initial deck", deck)
print()

# Shuffle Deck
random.shuffle(deck)
print("Shuffle function:", deck)

# Turn face back to number for sorting
for i in range(len(deck)):
    if deck[i][0] == "Ace":
        deck[i][0] = "1"
    elif deck[i][0] == "J":
        deck[i][0] = "11"
    elif deck[i][0] == "Q":
        deck[i][0] = "12"
    elif deck[i][0] == "K":
        deck[i][0] = "13"
        
# 仅修改这一行的排序规则
deck.sort(key=lambda item: (int(item[0]), item[1]))
print("Sort function: ", deck)

内容的提问来源于stack exchange,提问作者Mathieu Mahinan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:54:03