如何解包生成器?LeetCode Z字形变换代码输出异常问题
解决Z字形变换生成器输出问题
首先,咱们来定位你碰到的问题:你当前的print语句直接输出了生成器对象,这是因为("".join(line) for line in zigzag(word, num_rows))是一个生成器表达式——它是一个可迭代对象,但直接打印时只会显示其内存标识,不会自动迭代并拼接出最终字符串。
为什么*操作符没生效?
你尝试用*解包生成器,但print(*generator)会把生成器的每个元素作为独立参数传给print,参数之间会默认用空格分隔,这显然不是你想要的无间隔拼接字符串效果。
正确的解包与输出方式
要得到最终的拼接字符串,你需要把生成器的结果直接传给外层的"".join(),让它把所有子字符串拼接成一个完整的结果:
if __name__ == "__main__": word = "PAYPALISHIRING" num_rows = 4 # 先遍历二维数组,把每行转成字符串,再拼接所有行 result = "".join("".join(line) for line in zigzag(word, num_rows)) print(result)
或者更简洁的嵌套写法:
print("".join("".join(line) for line in zigzag(word, num_rows)))
额外的函数优化建议
你的zigzag函数可以做一点小优化,初始化二维列表时用列表推导式更简洁高效,同时方向调整的逻辑也能简化:
def zigzag(word, num_rows): # 用列表推导式替代循环append array = [[] for _ in range(num_rows)] increasing = 1 array_index = 0 word_index = 0 while word_index < len(word): array[array_index].append(word[word_index]) array_index += increasing word_index += 1 # 简化方向切换逻辑 if array_index == -1: increasing = 1 array_index = 1 elif array_index == num_rows: increasing = -1 array_index = num_rows - 2 return array
这样调整后,函数逻辑更清晰,同时也能正确生成每行的字符列表,配合上面的print语句就能输出正确的Z字形变换结果了。
内容的提问来源于stack exchange,提问作者MrJoe
相关产品推荐
相关产品推荐

