import collections
class Card:
    def __init__(self, rank, suit):
        self._rank = rank
        self._suit = suit
    @property
    def rank(self):
        return self._rank
    @rank.setter
    def rank(self, val):
        self._rank = val
    @property
    def suit(self):
        return self._suit
    @suit.setter
    def suit(self, val):
        self._suit = val
    def __str__(self):
        return f'{self.rank} {self.suit}'
    def __repr__(self):
        return f'Card(rank="{self.rank}", suit="{self.suit}")'
    
        
from random import choice, shuffle

class FrenchDeck:
    ranks = [str(n) for n in range(2, 11)] + list('JQKA')
    suits = 'spades diamonds clubs hearts'.split()
    
    def __init__(self, koliko = None):
        if koliko is None:
            koliko = len(FrenchDeck.ranks) * len(FrenchDeck.suits)
        self._cards = [Card(rank, suit) for suit in self.suits
                        for rank in self.ranks]
        shuffle(self._cards)    
        self._cards = self._cards[:koliko]
        
    def __len__(self):
        return len(self._cards)
    def __getitem__(self, position):
        return self._cards[position]
    def __str__(self):
        izp = ''
        for card in self._cards:
            izp += str(card) + '\n'
        return izp[:-1]
    
if __name__ == '__main__':
     suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)
     def spades_high(card):
         rank_value = FrenchDeck.ranks.index(card.rank)
         return rank_value * len(suit_values) + suit_values[card.suit]
     # choose
     my_hand = FrenchDeck(5)
     print(my_hand)
     sorted_hand = sorted(my_hand, key = spades_high)
     print(sorted_hand)
    
        
        
