2013-02-21 65 views
3

我有一個包含dict字符串列表,並希望在格式像打印出來的一切作爲表的終端:如何列表的字典格式化爲表

+----------------------------------------------+ 
| key1 | key2 | key3 | key4 | 
+----------------------------------------------+ 
| val_1 | val_1 | val_1 | val_1 | 
|----------|----------|-----------|------------| 
| val_2 | val_2 | val_2 | val_2 | 
+----------------------------------------------+ 

有沒有一個驚人的模塊或實現這個簡單的方法?我有一個列寬,我通過查找每個列表中最長的val得到。

回答

8

你可以使用PrettyTable

  • 我對鍵進行排序並對值進行排序。這產生了可預測的輸出。
  • 我選擇了PrettyTable,因爲它可以通過apt-get install python-prettytable在Ubuntu中安裝。

#! /usr/bin/env python 

from prettytable import PrettyTable 

d1 = { 
    "key1":["val1_1", "val1_2"], 
    "key2":["val2_1", "val2_2"], 
    "key3":["val3_1", "val3_2"], 
    "key4":["val4_1", "val4_2"], 
} 

table = PrettyTable() 

for key,val in sorted(d1.iteritems()): 
    table.add_column(key, sorted(val)) 

print table 

結果是:

$ ./t 
+--------+--------+--------+--------+ 
| key1 | key2 | key3 | key4 | 
+--------+--------+--------+--------+ 
| val1_1 | val2_1 | val3_1 | val4_1 | 
| val1_2 | val2_2 | val3_2 | val4_2 | 
+--------+--------+--------+--------+ 

PrettyTable還提供HTML格式。更換print table有:

print table.get_html_string(attributes={"size":"100%", "class":"MyTable"}) 

,你會得到:

<table border="1" class="MyTable" size="100%"> 
    <tr> 
     <th>key1</th> 
     <th>key2</th> 
     <th>key3</th> 
     <th>key4</th> 
    </tr> 
    <tr> 
     <td>val1_1</td> 
     <td>val2_1</td> 
     <td>val3_1</td> 
     <td>val4_1</td> 
    </tr> 
    <tr> 
     <td>val1_2</td> 
     <td>val2_2</td> 
     <td>val3_2</td> 
     <td>val4_2</td> 
    </tr> 
</table> 
4

TextTable作品,並且可以通過

pip install texttable 

http://foutaise.org/code/texttable/

https://pypi.python.org/pypi?name=texttable&:action=display

鍵在地圖不排序進行安裝,所以你不能保證一個特定的順序。

TextTable只接受行爲主表排序,所以你必須得到一點花哨的迭代器:

import texttable 
import itertools 

theDict = {"key1": ["val_1", "val_2"], 
      "key2": ["val_1", "val_2"], 
      "key3": ["val_1", "val_2"], 
      "key4": ["val_1", "val_2"]} 

theTable = texttable.Texttable() 
theIter = itertools.chain(
    iter([theDict.keys()]), 
    itertools.imap(lambda *x: list(x), *theDict.itervalues()) 
    ) 

theTable.add_rows(theIter) 
print theTable.draw() 

其中給出:

+-------+-------+-------+-------+ 
| key3 | key2 | key1 | key4 | 
+=======+=======+=======+=======+ 
| val_1 | val_1 | val_1 | val_1 | 
+-------+-------+-------+-------+ 
| val_2 | val_2 | val_2 | val_2 | 
+-------+-------+-------+-------+ 
+1

你應該在答案中包含更多信息,而不僅僅是一個鏈接。請參閱:[是否只包含其他鏈接的答案真的是「很好的答案」?](http://meta.stackexchange.com/q/8231) – 2013-02-21 01:33:42

+0

@JoelCornett我知道,但我認爲這個答案會比我更快地得到答案編寫示例代碼,所以我想獲得一個佔位符。 – Soverman 2013-02-21 02:06:05

+0

不夠公平。 + 1'd – 2013-02-21 03:52:52

1

與KEY1,KEY2,KEY3問題等等,就是密鑰中的密碼不是有序的。因此,我覺得如此自由來改變你的詞典到鍵值元組的列表,以獲得排序進入鍵:

然後,您可以做這樣的事情:

d = [ ('Coco', ['verde', 'redondo']), 
    ('Plátano', ['amarillo', 'doblado']), 
    ('Fresa', ['rojo', 'redondo chiquito']) ] 

def makeTable (d): 
    widths = [2 + max ([len (k) ] + [len (v) for v in vs]) for k, vs in d] 
    formats = ['{:^%s}' % width for width in widths] 
    values = zip (* ([k] + vs for k, vs in d)) 
    sep = '\n+' + '-' * (sum (widths) + len (d) - 1) + '+\n' 
    rows = sep.join ('|{}|'.format ('|'.join (formats [i].format (k) for i, k in enumerate (vs))) for vs in values) 
    return sep + rows + sep 

print (makeTable (d)) 

爲了將字典轉換爲元組列表,只需使用[ (k, v) for k, v in d.items() ]即可。

把這兩件事情一起將導致:

d = {'Coco': ['verde', 'redondo'], 
    'Plátano': ['amarillo', 'doblado'], 
    'Fresa': ['rojo', 'redondo chiquito'] } 

print (makeTable ([ (k, v) for k, v in d.items() ])) 
+0

還有['collections.OrderedDict'](http://docs.python.org/2/library/collections.html#ordereddict-objects)類型。 – askewchan 2013-02-21 01:52:41

+0

另一個可行的選項基本歸結爲相同。 – Hyperboreus 2013-02-21 01:53:14

0

如果你只需要使用它來查看您的格式良好的有道詞典的內容,你可以給一個嘗試將Python dict formatter and viewer這看起來完全是這樣 - 它可以將dict(或者dicts列表)顯示爲表格或樹。

+1

鏈接已損壞。 – fantabolous 2016-04-01 02:38:36

相關問題