使用基数排序对表格中子列表内字符串排序的问题咨询
问题排查与修复方案
首先,咱们先明确你的代码运行时遇到的核心问题:你把二维列表直接传给了radix_sort函数,但这个函数的设计目标是排序单个字符串列表。
当你调用radix_sort(table,0)时,函数里的s会是['BA','A']和['CC','AA']这样的子列表,而非单个字符串。执行到ord(s[i])时,s[i]是像'BA'这样的多字符字符串,而ord()只能处理单个字符,所以会直接抛出TypeError: ord() expected a character, but string of length 2 found的错误。
另外,原代码的桶合并逻辑可以优化得更直观,但核心排序逻辑是没问题的。
修复后的完整代码
def radix_sort(L, i): if len(L) <= 1: return L done_bucket = [] # 26个英文字母对应26个桶,加1个桶处理已遍历完所有字符的短字符串 buckets = [[] for _ in range(27)] for s in L: if i >= len(s): done_bucket.append(s) else: # 计算当前字符对应的桶索引(A-Z对应0-25) char_idx = ord(s[i]) - ord('A') buckets[char_idx].append(s) # 递归排序每个桶,再合并结果 sorted_buckets = [] for bucket in buckets: sorted_buckets.extend(radix_sort(bucket, i + 1)) # 先放处理完的短字符串,再放排序后的桶内容 return done_bucket + sorted_buckets # 你的原始输入表格 table = [['BA','A'],['CC','AA']] # 遍历每个子列表,单独执行基数排序 sorted_table = [radix_sort(sublist, 0) for sublist in table] print(sorted_table)
关键修复点说明
- 修正输入方式:不再直接传递整个二维列表,而是遍历
table中的每个子列表,对单个字符串列表执行排序,这完全匹配你"每个子列表内的字符串元素排序"的需求。 - 优化桶合并逻辑:把原代码的列表推导式展开改为
extend,逻辑更直观,可读性更强,功能和原代码一致。 - 验证结果:运行后会输出
[['A', 'BA'], ['AA', 'CC']],完全符合每个子列表内字符串按字典序排序的预期。
如果你的需求是对整个二维列表里的所有字符串统一排序(而非子列表内部),只需要先扁平化列表再调用排序函数即可:
flat_table = [s for sublist in table for s in sublist] print(radix_sort(flat_table, 0)) # 输出 ['A', 'AA', 'BA', 'CC']
内容的提问来源于stack exchange,提问作者clink
相关产品推荐
相关产品推荐

