Python列表排列生成代码报错:TypeError问题排查求助
问题分析与解决
这个报错的根源是你递归终止条件的返回值不符合后续拼接的预期,咱们一步步拆解:
错误原因
当递归到最底层(len(arr)==1)时,你返回的是arr(比如['a']),而不是包含这个列表的列表(也就是[['a']])。这会导致上层递归的for p in perm(xs)循环直接遍历['a']里的元素——也就是字符串'a',而不是遍历一个包含排列结果的列表。
举个实际的执行场景:
当处理perm(['b','c'])时,会取x='b',xs=['c'],然后调用perm(['c'])返回['c']。此时for p in perm(['c'])会把p赋值为字符串'c',接下来执行['b'] + p,这就触发了TypeError——列表和字符串不能直接拼接。
同样,len(arr)==0时返回[]也是有问题的,因为递归时需要一个包含空排列的列表([[]])来让上层循环正常执行。
修正后的代码
只需要调整两个终止条件的返回值:
def perm(arr): if len(arr) == 1: return [arr] # 返回包含单个排列的列表 if len(arr) == 0: return [[]] # 返回包含空排列的列表 else: result = [] for i in range(len(arr)): x = arr[i] xs = arr[:i] + arr[i+1:] for p in perm(xs): result.append([x] + p) return result print(perm(['a', 'b', 'c']))
验证结果
运行修正后的代码会输出正确的全排列:
[['a', 'b', 'c'], ['a', 'c', 'b'], ['b', 'a', 'c'], ['b', 'c', 'a'], ['c', 'a', 'b'], ['c', 'b', 'a']]
内容的提问来源于stack exchange,提问作者zesla
相关产品推荐
相关产品推荐

