关于Python enumerate输出及print_table异常输出的技术问询
问题解答
为什么会出现(0,0)这类输出?
你对enumerate()的用法理解有误:
enumerate(可迭代对象)会返回由(索引, 元素)组成的元组序列。- 你的
print_table函数里,第一层循环for words in enumerate(data),这里的words其实是元组,比如第一个元组是(0, ['apples', 'oranges', 'cherries', 'banana']),第二个是(1, ['Alice', 'Bob', 'Carol', 'David']),第三个是(2, ['dogs', 'cats', 'moose', 'goose'])。 - 然后你又嵌套了
for word in enumerate(words),这相当于对每个元组再做enumerate:比如对元组(0, ['apples', ...])做enumerate,会得到(0, 0)(第一个元素的索引0,值0)和(1, ['apples', ...])(第二个元素的索引1,值是子列表),这就是你看到的那些奇怪输出的来源。
修正后的代码
先修正calculate_widht里的拼写错误(widht→width,lenght→length),再重新实现print_table的逻辑——要实现右对齐表格,需要按列遍历数据(预期输出每行对应原数据所有子列表的第n个元素),用计算好的列宽做右对齐:
def calculate_width(data): col_width = [0] * len(data) for i, words in enumerate(data): max_length = 0 for word in words: if len(word) > max_length: max_length = len(word) col_width[i] = max_length return col_width def print_table(col_widths, data): # 按行遍历(子列表的元素索引) for row_idx in range(len(data[0])): row = [] # 遍历每一列,取出对应元素并右对齐 for col_idx in range(len(data)): word = data[col_idx][row_idx] row.append(word.rjust(col_widths[col_idx])) # 拼接成一行输出 print(' '.join(row)) def main(): data = [['apples', 'oranges', 'cherries', 'banana'], ['Alice', 'Bob', 'Carol', 'David'], ['dogs', 'cats', 'moose', 'goose']] widths = calculate_width(data) print_table(widths, data) if __name__ == '__main__': main()
运行结果
运行后会得到预期输出:
apples Alice dogs oranges Bob cats cherries Carol moose banana David goose
内容的提问来源于stack exchange,提问作者Jarne Vercruysse
相关产品推荐
相关产品推荐

