使用Python的join()处理嵌套列表时出现类型错误的问题排查
问题分析与修复
核心问题
你在seperate_words=True的分支中,错误地将打乱后的字母列表直接添加到scrambled_list中,导致scrambled_list变成了嵌套列表([[字母], [字母], ...])。而str.join()方法要求传入的序列元素必须是字符串类型,因此触发sequence item 0: expected str instance, list found错误。
同时你的循环逻辑存在冗余:每次循环都执行拼接操作,会重复累加已处理的内容,应该等所有单词处理完成后再统一拼接。
修复步骤
- 将打乱的字母列表转为字符串再存入
scrambled_list:把scrambled_list.append(letters_list)改为scrambled_list.append("".join(letters_list)),确保scrambled_list是字符串列表而非嵌套列表。 - 调整拼接时机:将拼接操作移到循环外部,用空格连接所有打乱后的单词(符合保留单词分隔的需求),再赋值给
scramble变量。
修改后的完整代码
# SCRAMBLE WORD/PHRASE # IMPORTS import random # VARIABLES test_words_list = ["dark", "happy holidays", "computer", "I like pie", "dogs love pizza"] def scramble_string(string, seperate_words = False): scramble = "" if seperate_words == False: """Remove spaces & scramble all letters together into one string""" words_list = string.split(" ") for word_str in words_list: word_letter_list = [letter for letter in word_str] random.shuffle(word_letter_list) word_letter_str = "".join(word_letter_list) scramble += word_letter_str return scramble else: """scramble letters in words without mixing letters from different words. List words in same order with space between, but with letters scrambled""" scrambled_list = [] words_list = string.split() for word_str in words_list: letters_list = [letter for letter in word_str] random.shuffle(letters_list) # 改动1:将字母列表转为字符串后再添加 scrambled_list.append("".join(letters_list)) # 改动2:循环结束后统一用空格拼接所有打乱的单词 scramble = " ".join(scrambled_list) return scramble # Tests # print(scramble_string(test_words_list[1])) # WORKS print(scramble_string(test_words_list[-1], True)) # 示例输出:"ogsdl evo ziapz"(随机结果)
额外优化建议
可以把“打乱单个单词”的逻辑抽成独立函数,让主函数更简洁,代码复用性更高:
def scramble_word(word): letters = list(word) random.shuffle(letters) return "".join(letters)
之后主函数里的循环可以简化为scrambled_list.append(scramble_word(word_str)),可读性更强。
内容的提问来源于stack exchange,提问作者M Green
相关产品推荐
相关产品推荐

