为什么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
相关产品推荐
相关产品推荐

