<p>你可以试试这样的方法:</p>
<pre><code>In [1]: headers = ["name","level","value"]
In [2]: vals1 = ["Some long name", "a level", "a value"]
In [3]: vals2 = ["An even longer name", "another level", "another value"]
In [4]: max_lens = [len(str(max(i, key=lambda x: len(str(x))))) for i in zip(headers, vals1, vals2)]
In [5]: for row in (headers, vals1, vals2):
...: print '|'.join('{0:{width}}'.format(x, width=y) for x, y in zip(row, max_lens))
...:
...:
name |level |value
Some long name |a level |a value
An even longer name|another level|another value
</code></pre>
<p>这将查找数据中行的最大长度,并打印一个等距的表。在这种情况下,<code>max_lens</code>使用<code>zip</code>压缩给定“列”中的所有项(例如,考虑<code>name</code>列中的所有项)。然后,它找到最长字符串的长度(正如@Bakuriu指出的,如果任何字段不是字符串,这些字符串都需要转换为字符串),并将其存储为“column”的长度。然后在迭代中,指定一个<code>width</code>,它将等于该“列”的最大长度,并在该行上传递该列的值(希望这是有意义的:))。</p>
<p><code>format</code>方法使用非常强大的字符串格式规范。这是一个非常基本的示例,但是可以对其进行修改,以适应更动态的情况(例如有许多行的情况等)。</p>
<p>关于它如何处理数据的示例,您可以尝试下面的示例。请注意,这不是最可读的代码(这在Python中很重要),因此如果您要做类似的事情,那么实际写出一些<code>for</code>循环可能是值得的,这样可以更清楚地看到发生了什么(因为正如我所说,它有点模糊:):</p>
<pre><code>In [1]: class MyClass(object):
...: def __init__(self, a, b, c):
...: self.name = a
...: self.level = b
...: self.value = c
...:
...:
In [2]: headers = ['name', 'level', 'value']
In [3]: vals1 = MyClass('Some long name', 'a level', 10348)
In [4]: vals2 = MyClass('An even longer name', 'another level', 100008484)
In [5]: items = (vals1, vals2)
In [6]: item_lens = [[getattr(item, x) for x in headers] for item in items]
In [7]: max_lens = [len(str(max(i, key=lambda x: len(str(x))))) for i in zip(*[headers] + item_lens)]
In [8]: print '|'.join('{0:{width}}'.format(x, width=y) for x, y in zip(headers, max_lens))
name |level |value
In [9]: for i in items:
...: print '|'.join('{0:{width}}'.format(x, width=y) for x, y in zip([getattr(i, x) for x in headers], max_lens))
...:
...:
Some long name |a level |10348
An even longer name|another level|100008484
</code></pre>