簡體   English   中英

使用列表設計可擴展的命令行界面

[英]Designing an expandable command-line interface with lists

這些是我的三個列表:

# made up data
products = ['apple','banana','orange'] 
prices = ['£0.11','£0.07','£0.05']
dates = ['02/04/2017','14/09/2018','06/08/2016']

重要的是要知道

  • 這些列表中的數據將隨其大小而變化,但它們將保持相同的數據類型。
  • 每個列表的第一個元素是鏈接的,同樣適用於第二個和第三個元素等...

所需的命令行界面:

Product | Price | Date of Purchase
--------|-------|------------------
 apple  | £0.11 |    02/04/2017
--------|-------|------------------
 banana | £0.07 |    14/09/2018
--------|-------|------------------
 orange | £0.05 |    06/08/2016

我想創建一個這樣的表。 如果每個列表中有更多元素但我不知道如何創建它,它顯然應該繼續。

我可以做

print(""" Product | Price | Date of Purchase   # etc...
          --------|-------|------------------
              %s  |   %s  |     %s 
""" % (products[0],prices[0],dates[0])) 

但我認為這將是對接口的硬編碼,這不是理想的,因為列表具有未確定的長度

有幫助嗎?

試試熊貓:

import pandas as pd
products = ['apple','banana','orange'] 
prices = ['£0.11','£0.07','£0.05']
dates = ['02/04/2017','14/09/2018','06/08/2016']

df = pd.DataFrame({"Product": products, "Price": prices, "Date of Purchase": dates})

print(df)

輸出:

  Product  Price Date of Purchase
0   apple  £0.11       02/04/2017
1  banana  £0.07       14/09/2018
2  orange  £0.05       06/08/2016
import beautifultable
from beautifultable import BeautifulTable
table = BeautifulTable()
# made up data
products = ['apple','banana','orange'] 
prices = ['£0.11','£0.07','£0.05']
dates = ['02/04/2017','14/09/2018','06/08/2016']

table.column_headers=['Product' ,'Price','Date of Purchase']
for i in zip(products,prices,dates):
    table.append_row(list(i))
print(table)

輸出是:

+---------+-------+------------------+
| Product | Price | Date of Purchase |
+---------+-------+------------------+
|  apple  | £0.11 |    02/04/2017    |
+---------+-------+------------------+
| banana  | £0.07 |    14/09/2018    |
+---------+-------+------------------+
| orange  | £0.05 |    06/08/2016    |
+---------+-------+------------------+

如果你想要一個不使用庫的版本,這里有一個相當簡單的函數,可以使用一些列表推導

def print_table(headers, *columns):
    # Ignore any columns of data that don't have a header
    columns = columns[:len(headers)]

    # Start with a space to set the header off from the left edge, then join the header strings with " | "
    print(" " + " | ".join(headers))
    # Draw the header separator with column dividers based on header length
    print("|".join(['-' * (len(header) + 2) for header in headers]))

    # Iterate over all lists passed in, and combine them together in a tuple by row
    for row in zip(*columns):
        # Center the contents within the space available in the column based on the header width
        print("|".join([
            col.center((len(headers[idx]) + 2), ' ')
            for idx, col in enumerate(row)
        ]))

這不會處理比列標題長度+ 2更長的單元格值。但是,通過截斷單元格內容可以很容易地實現( 這里可以看到字符串截斷的示例)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM