Search code examples
pythondynamicterminalformattingtabular

How do I dynamically print a table of strings in the terminal?


I need to dynamically create a dict of dicts and then print them in a neat table in the terminal. Eventually, i'm going to be adding to each dict and re-printing the table.

Here's my code so far:

def handy(self, play_deck):
    a = raw_input('How many hands? ')
    for i in range(int(a)):
        h = "hand" + str(i+ 1) # dynamilly create key
        q, play_deck = self.deal(self.full_deck) # pull cards from deck
        self.dict_of_hands.setdefault(h, q) # load up dict of hands

    hand_keys = self.dict_of_hands.keys()
    the_hands = self.dict_of_hands
    print "\n"
    for hand in hand_keys:
        for card in range(len(the_hands[hand].keys())):
            print hand
            print the_hands[hand][card]

and my output is this:

How many hands? 4

hand4
6 of Clubs
hand4
4 of Diamonds
hand1
8 of Diamonds
hand1
10 of Hearts
hand2
10 of Hearts
hand2
5 of Clubs
hand3
9 of Diamonds
hand3
3 of Hearts

I'd like to have:

hand1           hand2           hand3            hand4
2 of hearts     8 of spades     ace of clubs     jack of diomonds
5 of diamonds   ...             ...              ...etc.

The examples i've seen on SO are based on a known number of columns. This needs to be dynamic.


Solution

  • OK. Taking what @ecatmur provided, I now have the following, which seems to work for now.

    def handy(self, play_deck):
        a = raw_input('How many hands? ')
        for i in range(int(a)):
            h = "hand" + str(i+ 1) # dynamilly create key
            q, play_deck = self.deal(self.full_deck) # pull cards from deck
            self.dict_of_hands.setdefault(h, q) # load up dict of hands
    
        hand_keys = self.dict_of_hands.keys()
        the_hands = self.dict_of_hands
    
        first_cards = []
        second_cards = []
        for hand in the_hands:
            # print the_hands[hand][0]
            first_cards.append(the_hands[hand][0])
    
        for hand in the_hands:
            # print the_hands[hand][1]
            second_cards.append(the_hands[hand][1])         
    
        header = self.dict_of_hands.keys()
    
    
        table = texttable.Texttable()
        table.header(header)
        table.add_rows([first_cards, second_cards], header=False)
        print table.draw()
    

    and the out put is:

    How many hands? 4
    +---------------+---------------+------------------+---------------+
    |     hand4     |     hand1     |      hand2       |     hand3     |
    +===============+===============+==================+===============+
    | Jack of Clubs | 9 of Diamonds | Jack of Diamonds | 4 of Spades   |
    +---------------+---------------+------------------+---------------+
    | 6 of Diamonds | 10 of Spades  | 9 of Diamonds    | Ace of Hearts |
    +---------------+---------------+------------------+---------------+
    

    The last piece to the puzzle will be making the following line dynamic:

    table.add_rows([first_cards, second_cards], header=False)
    

    Eventually, I'll need each hand to be of varying length.