你可以試試是這樣的:
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
此發現您的數據行的最大長度,並打印均勻間隔的表。在這種情況下,max_lens
使用zip
將給定'列'中的所有項目一起壓縮(例如,考慮name
列中的所有項目)。然後,它會查找最長字符串的長度(正如@Bakuriu指出的那樣,如果任何字段不是字符串,這些字符串都需要轉換爲字符串)並將其存儲爲'列'的長度。然後在迭代中,您指定一個width
,它將等於該'列'的最大長度,並傳入該行的該行的值(希望有意義:))。
format
方法利用了非常強大的字符串格式化規範。這是一個非常基本的例子,但它可以修改以適應更多的動態情況(例如那些有很多行的情況等)。
至於如何使用您的數據的例子,你可以嘗試下面的例子。請注意,這不是最可讀的代碼(在Python裏是重要的),所以如果你是做同樣的事情,它可能是值得的實際編寫出一些for
循環,使這是一個有點更明顯發生了什麼是怎麼回事(因爲正如我所說,這是一個有點混淆:)):
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
+1尼斯和整齊 –
@ShawnZhang謝謝:) – RocketDonkey
我喜歡'鍵=拉姆達X:LEN(X)': ) – khachik