How do I output lists as a table in Jupyter notebook?

后端 未结 11 1027
灰色年华
灰色年华 2021-01-30 09:51

I know that I\'ve seen some example somewhere before but for the life of me I cannot find it when googling around.

I have some rows of data:

data = [[1,2         


        
11条回答
  •  深忆病人
    2021-01-30 10:32

    I want to output a table where each column has the smallest possible width, where columns are padded with white space (but this can be changed) and rows are separated by newlines (but this can be changed) and where each item is formatted using str (but...).


    def ftable(tbl, pad='  ', sep='\n', normalize=str):
    
        # normalize the content to the most useful data type
        strtbl = [[normalize(it) for it in row] for row in tbl] 
    
        # next, for each column we compute the maximum width needed
        w = [0 for _ in tbl[0]]
        for row in strtbl:
            for ncol, it in enumerate(row):
                w[ncol] = max(w[ncol], len(it))
    
        # a string is built iterating on the rows and the items of `strtbl`:
        #   items are  prepended white space to an uniform column width
        #   formatted items are `join`ed using `pad` (by default "  ")
        #   eventually we join the rows using newlines and return
        return sep.join(pad.join(' '*(wid-len(it))+it for wid, it in zip(w, row))
                                                          for row in strtbl)
    

    The function signature, ftable(tbl, pad=' ', sep='\n', normalize=str), with its default arguments is intended to provide for maximum flexibility.

    You can customize

    • the column padding,
    • the row separator, (e.g., pad='&', sep='\\\\\n' to have the bulk of a LaTeX table)
    • the function to be used to normalize the input to a common string format --- by default, for the maximum generality it is str but if you know that all your data is floating point lambda item: "%.4f"%item could be a reasonable choice, etc.

    Superficial testing:

    I need some test data, possibly involving columns of different width so that the algorithm needs to be a little more sophisticated (but just a little bit;)

    In [1]: from random import randrange
    
    In [2]: table = [[randrange(10**randrange(10)) for i in range(5)] for j in range(3)]
    
    In [3]: table
    Out[3]: 
    [[974413992, 510, 0, 3114, 1],
     [863242961, 0, 94924, 782, 34],
     [1060993, 62, 26076, 75832, 833174]]
    
    In [4]: print(ftable(table))
    974413992  510      0   3114       1
    863242961    0  94924    782      34
      1060993   62  26076  75832  833174
    
    In [5]: print(ftable(table, pad='|'))
    974413992|510|    0| 3114|     1
    863242961|  0|94924|  782|    34
      1060993| 62|26076|75832|833174
    

提交回复
热议问题