Разработка расширяемого интерфейса командной строки со списками - PullRequest
0 голосов
/ 28 декабря 2018

Вот три списка, которые у меня есть:

# 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])) 

Но я думаю, что это будет жесткое программирование интерфейса, что не идеально, потому что список имеет неопределенную длину

Любая помощь?

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018
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    |
+---------+-------+------------------+
0 голосов
/ 28 декабря 2018

Если вы хотите версию, которая не использует библиотеку, вот довольно простая функция, которая использует некоторые списки

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. Но это было бы легко реализовать с усечением содержимого ячейки (пример усечения строки можно увидеть здесь ).

0 голосов
/ 28 декабря 2018

Попробуйте панд:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...