Die Begründung für diese abwägige Aufgabenstellung ist ziemlich schräg, aber das Problem ist lösbar, wenn es auch etwas länger gedauert hat:
# URL http://www.hpcodewars.org/past/cw14/problems/ProblemSet2011Final.pdf # Problem: 7. QWERTY Sort (7 P) # Sortierschluessel ordnung = [a for a in "QWERTYUIOPASDFGHJKLZXCVBNM"] data = """ARREST SUBDIVISION DISCONTENT SUPERIOR TOPOLOGY DEBUNK APPENDIX SUBDUE TRUNK .""" def liste_sortieren(liste,ordnung): ''' Diese Funktion erledigt die Sortierung und gibt die sortierte Liste zurueck ''' while True: # Wenn die Liste sortiert ist, # bleibt das beim Durchlauf auf True sortiert = True # Iterier über die Liste for i in range(len(liste)): # Prüfe 2 benachbarte Listenelemente, # ihre Buchstaben von vorn nach hinten, # wenn die Buchstaben gleich, dann weiter # sonst # a.) bekomme für den Buchstaben1 den Listenindex, # b.) bekomme für den Buchstaben2 den Listenindex, # wenn a > b, dann tausche # sonst bleibt es so try: for id in range(len(liste[i])): if liste[i][id] == liste[i+1][id]: pass else: if ordnung.index(liste[i][id]) > ordnung.index(liste[i+1][id]): # print("Tausche!",liste[i],liste[i+1]) # print("Pruefe gerade:",liste[i][id],liste[i+1][id]) # Dreh die beiden Elemente in der Liste um liste[i], liste[i+1] = liste[i+1], liste[i] # print("Getauscht:",liste[i],liste[i+1]) # Liste war noch nicht sortiert (!) sortiert = False break except IndexError: # Ende der Liste erreicht pass # gehe zum nächsten Listenpaar if sortiert == True: return liste # Brich ab!!! # Normal break, dann Ausgabe, hier return, # weil in eine Funktion gepackt # Bekomm die Werte data = data.split("\n") liste = [] for zeile in data: if not zeile == ".": liste.append(zeile) # Liste soll sortiert werden # Da es nur "eine" Liste gibt, # brauche ich die nicht an die Funktion zu binden, # also nicht liste = liste_sortieren(liste,ordnung) liste_sortieren(liste,ordnung) # Elemente der Liste werden ausgegeben - - - Ausgabe for item in liste: print(item)Naja, noch frage ich mich, ob ein alternatives Sortierverfahren die Aufgabe performanter lösen könnte. Im Kern kopiere ich hier eine Abwandlung des Bubblesort-Algorithmus, wobei meine Implementierung nicht sehr performant ist, weil - wie mir scheint - nicht jeder mögliche Tausch vorgenommen wird.
Bei der Definition von `ordnung` am Anfang hätte man einfach die Zeichenkette verwenden können, denn die hat genau wie `list` eine `index()`-Methode.
AntwortenLöschenLetztendlich ist das aber alles ziemlich aufwändig wenn man bedenkt dass Python bereits eine Methode zum sortieren besitzt, der man auch ein Sortierkriterium vorgeben kann. Die QWERTY-Sortierfunktion selbst lässt sich in zwei Zeilen ausdrücken: http://pastebin.com/25GLW73c