2012-05-24 17 views
6

Mam listę list:Sortowanie listę list od długości i wartości

>>> a = [['3D'], ['3D', '4D', '5D'], ['4C'], ['2C'],['4C', '4D'], ['4D'], ['5D'], \ 
... ['JC'], ['JC', 'JS'], ['JS']] 

można zauważyć, że jest to wartość karty tj C = Kluby itp J = Jack itp Mam też lista referencyjna:

>>> confrom = {'3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, \ 
... '0':10, 'J':11, 'Q':12, 'K':13, 'A':14, '2':15} 

Jak gram gra karciana, w której maksymalna wartość wynosi 2. Aby sortować według długości listy, robię:

>>> a = sorted(a, key = lambda x: len(x)) 
>>> a 
... [['3D'], ['4C'], ['4D'], ['2C'], ['5D'], ['JC'], ['JS'], ['4C', '4D'], ['JC', 'JS'], ['3D', '4D', '5D']] 

muszę t O również sortować je według ich wartości słowniku więc moja lista wynikające byłoby:

>>> [['3D'], ['4C'], ['4D'], ['5D'], ['JC'], ['JS'], ['2C'], ['4C', '4D'], ['JC', 'JS'], ['3D', '4D', '5D']] 

Obecnie jest to dość prosta implementacja, ale chcę móc sortować je w bardziej skomplikowany sposób.

Odpowiedz

9

Spróbuj tego:

sorted(a, key = lambda x: (len(x), [confrom[card[0]] for card in x])) 

ideone

+0

To będzie działać, jeśli wszystkie listy były o długości 1, ale x [0] Dla lista ["4C", "4D"] to "4D", więc wygrała; t być w stanie przekonwertować – tcatchy

+0

@ FRU5TR8EDD: Spróbuj użyć zrozumienia list. Zobacz aktualizację. –

+0

Godsend, dziękuję bardzo – tcatchy

2

To może być naprawdę dobry przykład, gdy przejście od struktury danych bazy w Pythonie do klasy.

Rozważmy:

values = ('2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A') 
suits = ('H', 'C', 'D', 'S') 
sRep = {'H':'Hearts', 'C':'Clubs', 'D':'Diamonds', 'S':'Spades'} 
ranks = {'2':15, '3':3, '4':4,'5':5,'6':6,'7':7,'8':8, 
     '9':9, '0':10, '0':10, 'J':11, 'Q':12, 'K':13, 'A':14 } 

class Card: 
    def __init__(self, value, suit): 
     value=str(value) 
     self.value, self.suit = value.upper(), suit.upper() 
     self.rSuit = sRep[suit.upper()] 
     self.rank = ranks[value.upper()] 

    def __repr__(self): 
     return "%s of %s" % (self.value, self.rSuit) 

    def __cmp__(self,other): 
     if self.rank > other.rank: return 1 
     if self.rank < other.rank: return -1  
     if self.value > other.value: return 1 
     if self.value < other.value: return -1 
     if self.rSuit > other.rSuit: return 1 
     if self.rSuit < other.rSuit: return -1 
     return 0 

Wypróbuj niektóre karty:

c1=Card(2,'s')  
c2=Card(4,'d') 

if c1>c2: 
    print "A", c1, "beats a", c2 
elif c2>c1:  
    print "A", c2, "beats a", c1 
else: 
    print "Same..."  

Drukuje:

A 2 of Spades beats a 4 of Diamonds 

Ponieważ zdefiniowaliśmy porządek w klasie, kompleks sortowania jest łatwe i ranking oparty na różnych grach jest łatwy.

Twoja lista kart jako przykład:

a = [['3D'], ['3D', '4D', '5D'], ['4C'], ['2C'],['4C', '4D'], ['4D'], ['5D'], ['JC'], ['JC', 'JS'], ['JS']] 

print sorted([Card(c[0],c[1]) for e in a for c in e]) 

Wydruki:

[3 of Diamonds, 3 of Diamonds, 4 of Clubs, 4 of Clubs, 4 of Diamonds, 
4 of Diamonds, 4 of Diamonds, 5 of Diamonds, 5 of Diamonds, J of Clubs, 
J of Clubs, J of Spades, J of Spades, 2 of Clubs] 

Z trochę więcej pracy, można zdefiniować za ręce i co ręka bije innej strony.

Możesz przeczytać więcej na ten przykład w klasycznej książce Python Jak myśleć jak komputer Scientist: Nauka o Pythonie HERE