Search code examples
pythonprettytable

Python Prettytable Separating Each Table


I have a little question. How I can split the table if they have the same column name?

This is the example:

+----------------------------+
|       AUDIO TRACKS         |
+----+----------+------------+
| ID | LangCode | LangName   |
+----+----------+------------+
| 1  | de       | German     |
| 2  | de       | German     |
| 3  | en       | English    | 
| 4  | en       | English    |
| 5  | es       | Spanish    |
| 6  | es       | Spanish    |
+----------------------------+

This is my desired output

+----------------------------+
|       AUDIO TRACKS         |
+----+----------+------------+
| ID | LangCode | LangName   |
+----+----------+------------+
| 1  | de       | German     |
| 2  | de       | German     |
|----------------------------|
| 3  | en       | English    | 
| 4  | en       | English    |
|----------------------------|
| 5  | es       | Spanish    |
| 6  | es       | Spanish    |
+----------------------------+

Solution

  • You can do this with itertools.groupby and after each group add split_row like below:

    from prettytable import PrettyTable
    from itertools import groupby
    
    myTable = PrettyTable(["ID", "LongCode", "LangName"])
      
    lst = [["1", "de", "German"], ["2", "de", "German"], 
           ["3", "en", "English"], ["4", "en", "English"],
           ["5", "es", "Spanish"], ["4", "es", "Spanish"]]
    
    split_row = ['—' * x for x in [2, 8, 10]]
    
    myTable.title = 'AUDIO TRACKS'
    for key, group in groupby(lst, lambda x: x[1]):
        for g in group:
            myTable.add_row(g)
        myTable.add_row(split_row)
    print(myTable)
    

    Output:

    +----------------------------+
    |        AUDIO TRACKS        |
    +----+----------+------------+
    | ID | LongCode |  LangName  |
    +----+----------+------------+
    | 1  |    de    |   German   |
    | 2  |    de    |   German   |
    | —— | ———————— | —————————— |
    | 3  |    en    |  English   |
    | 4  |    en    |  English   |
    | —— | ———————— | —————————— |
    | 5  |    es    |  Spanish   |
    | 4  |    es    |  Spanish   |
    | —— | ———————— | —————————— |
    +----+----------+------------+