2012-05-24 18 views
6

Ich habe eine Liste von Listen:Sortieren eine Liste von Listen von Länge und Wert

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

Sie werden feststellen, dass dies Kartenwerte, dh: C = Clubs usw. J = Jack usw. Ich habe auch eine Referenzliste:

>>> 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} 

Als ich ein Kartenspiel spielte, wo der Maximalwert 2 ist durch die Länge der Liste zu sortieren, ich mache:

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

ich brauche t o sie auch nach ihrem Wörterbuch Wert sortieren, so meine resultierende Liste wäre:

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

Derzeit ist dies eine ganz einfache Implementierung, aber ich mag es sortieren in einer komplizierteren Weise können.

Antwort

9

Versuchen Sie folgendes:

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

ideone

+0

Das ist alles funktionieren würde, wenn die Listen der Länge 1 sind, aber x [0] für ein Liste von ['4C', '4D'] ist '4D', so dass es nicht möglich ist – tcatchy

+0

@ FRU5TR8EDD zu konvertieren: Versuchen Sie es mit einem Listenverständnis. Siehe Aktualisierung. –

+0

Gott sei Dank, Vielen Dank – tcatchy

2

Dies kann ein wirklich gutes Beispiel sein, wenn von einer Basisdatenstruktur in Python zu einer Klasse zu überführen.

Bedenken Sie:

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 

Probieren Sie einige Karten:

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..."  

Diese Drucke:

A 2 of Spades beats a 4 of Diamonds 

Da wir eine Sortierreihenfolge in der Klasse definiert, komplexe Sortierung ist einfach und Ranking basierend auf verschiedenen Spielen ist einfach.

Ihre Kartenliste als Beispiel:

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]) 

Drucke:

[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] 

Mit ein wenig mehr Arbeit, können Sie die Hände definieren und welche Hand schlägt eine andere Hand.

Sie können mehr über dieses Beispiel im klassischen Python Buch lesen Wie Wie ein Informatiker denken: Lernen mit Python HERE

Verwandte Themen