keyerror:0

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
schlange91
User
Beiträge: 6
Registriert: Sonntag 24. Februar 2008, 19:57

mir wurde die aufgabe gestellt eine dic nach nachnamen zu ordnen aber da komm immer so ein doofer key error jetzt wollte ich mal wissen ob mir hier vllt einer weiterhelfen kann alles andere hab ich schon probiert leute aus dem kurs wissen auch nicht weiter

Code: Alles auswählen

import string


def selectionSort(liste):
	for anfang in range(len(liste)):
		minPos = anfang
		for i in range(anfang, len(liste)):
			if (liste[i]["Nachname"] < liste[minPos]["Nachname"]):
				minPos = i
		swap(liste, anfang, minPos)




a3=open("adressen.csv","r")


for i in a3.readlines():
    
    l = string.split(string.strip(i),";")
    dic={"Name":l[0], "Nachname":l[1], "Strasse":l[2], "Ort":l[3]}
    sort = dic
    selectionSort(sort)



print dic.keys()

a3.close()
das ist mein programm aber wenn ich jetzt das dic nach den nachnamen sortieren lassen will kommt immer der fehler die key sind vorhanden wenn ich sie printen lasse

KeyError: 0
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Arbeite doch bitte noch mal das Python Tutorial durch - und verstehe es - offensichtlich ist dir der unterschied zwischen einem Dictionary und einer Liste nicht bekannt.

Außerdem macht die letzte for-Schleife keinlerlei Sinn: Du erzeugst ein Dictionary mit dem Namen "dic", willst dieses in dem Schleifendurchlauf sortieren und danach wird es wieder verworfen.
schlange91
User
Beiträge: 6
Registriert: Sonntag 24. Februar 2008, 19:57

Mir ist sehr wohl der Unterschied zwischen Liste und Dictionary klar, um auf die letzte Schleife zurückzukommen diese ist nicht unsinnig es wird aus einer Liste mit Adressen ein Dic. erzeugt das ich sortieren und danach ausgeben lassen möchte die print Anweisung fehlt in diesem Fall(ich entschuldige mich dafür).
Aber auf meine eigentliche fragen kansnt ud mir anscheinend keine Antwort geben was ist ein KeyError: 0?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich sag doch, dass dir der Unterschied nicht klar ist ;-) :

Auf Elemente in einem Dictionary kannst du nicht über die Positionen der Elemente zugreifen, da diese KEINE Postion besitzen. Dies ist nur in Listen oder Tupeln der Fall (oder in Spezialfällen in Dictionaries) => du kannst ein Dictionary nicht sortieren.

Noch mal zur Schleife, vielleicht meinen wir zwei verschiedene Dinge: Willst du die Elemente einer Zeile der csv-Datei nach dem Nachnamen ordnen (sagt dein Code), oder - was ich logischer finde und auch deine Sortierung behauptet - eine Liste aller Einträge erzeugen und diese dann nach den Nachnamen sortieren?

Hast du ersters vor, kannst du das Dictionary per dic.items() in eine Liste umwandeln und dann sortieren.

Edit: Das gemeint?:

Code: Alles auswählen

users = []
for i in a3.readlines(): 
    l = string.split(string.strip(i),";") 
    users.append({"Name":l[0], "Nachname":l[1], "Strasse":l[2], "Ort":l[3]})
selectionSort(users)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Du willst wirklich das Modul ``cvs`` benutzen, wirklich!
schlange91
User
Beiträge: 6
Registriert: Sonntag 24. Februar 2008, 19:57

so ich weiß jetzt meinen Fehler danke eydu ich hatte genau das gemeint was du editiert hast das ich das zuerst in ne Liste schreibe und dann auf das dic in der Liste zugreife und das mit den anderne dics in der Liste vergleiche und das dann ordnen aber das eine dic keys hat war mir klar und eine liste indizes auch :P vielleicht nicht so rübergekommen danke nochmal.
Aber mal ne andere Frage warum ist mein Selectionsort nicht stabil wir sind heute in der schule gegen die wand gelaufen lehrer wusste auch nicht warum. Wir haben zuerst nach Nachnamen und dann nochmal nach Vornamen ordnen lassen also praktisch wie in einem Telefonbuch und ab nem bestimmten Punkt fängt der Algo an Müll zu machen woran kann das liegen hock hier jetzt schon ne halbe Stunde und guck auf dne Programmcode und mir wills nicht einfallen. Oder liegts vllt garnicht am Algo?
mfg Schlange
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Gib mal Testdaten und deine Tests her, dann können wir dir mehr dazu sagen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das liegt einfach daran, dass Selection-Sort nicht stabil ist. Schau dir mal dieses Beispiel an:

2a, 2b, 1, 3

Daraus wird dann im ersten Schritt:

1, 2b, 2a, 3

Damit ist die Folge sortiert, aber Selection-Sort offensichtlich nicht stabil.

Ist gibt aber stabile Variationen, einfach mal etwas googeln.

Edit: Vielleicht noch die Gewichte der Elemente:
w(1) = 1
w(2a) = 2
w(2b) = 2
w(3) = 3
BlackJack

Selectionsort ist instabil. Zumindest der Lehrer sollte das aber wissen. :-)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

warum eigentlich nicht einfach über
l.sort(key=lambda d: d['nachname])
?

Wenns nun nur im die Problemlösung geht...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

BlackJack hat geschrieben:Selectionsort ist instabil. Zumindest der Lehrer sollte das aber wissen. :-)
Tja, "sollte", "müsste" und "eigentlich", was wäre ein Informatiker ohne diese Begriffe :P

Aber wenn ich mich so an meinen Informatiklehrer in der Schule erinnere, dann liegt diese Unwissenheit schon im Bereich des möglichen...

@audax
Deine ist wahrscheinlich mit die einfachse Lösung, auch wenn ich sie noch ein wenig anders machen würde. Aber es sah schon sehr danach aus, das Selection-Sort zur Übung implementiert werden sollte.

Lösung mit dafür gedachten Bordmitteln:

Code: Alles auswählen

import operator
l.sort(key=operator.itemgetter("Nachname"))
Zuletzt geändert von EyDu am Montag 25. Februar 2008, 16:45, insgesamt 1-mal geändert.
BlackJack

@audax: Aus irgendwelchen Gründen wollen Informatiklehrer oft, dass man alle gängigen Sortieralgorithmen mal selbst implementiert hat. Faseln dann immer was von "Lerneffekt" oder so. Selbst die, die nicht wissen, das Selectionsort instabil ist. ;-)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

BlackJack hat geschrieben:@audax: Aus irgendwelchen Gründen wollen Informatiklehrer oft, dass man alle gängigen Sortieralgorithmen mal selbst implementiert hat. Faseln dann immer was von "Lerneffekt" oder so. Selbst die, die nicht wissen, das Selectionsort instabil ist. ;-)
Ich geb zu, ich hab nicht alles von ihm gelesen...
Sein Schreibstil ging mir gegen den Strich :D

Informatiklehrer tun mir leid, muss ein unglaublich langweiliger Job sein...

@Eydu:
operator kannte ich noch gar nicht Oo
schlange91
User
Beiträge: 6
Registriert: Sonntag 24. Februar 2008, 19:57

Jo aber ist was an dem Programmcode falsch, oder kann man irgendwo daran ablesen wo was schief gehn könnte? Tut mir leide den Test hab ich nicht -.- . Das war aber auch eigentlich kein Test sondern einfach nur meine Liste nach Nachnamen und dann nach Vornamen sortiert. Da geht dann was schief naja werd mal googeln und ja wir benutzen keine in Python eingebauten Funkrionen ^^.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Also ich sehe im Algorithmus auch auf den zweiten Blick keinen Fehler. Wie audax schon meinte, musst du mal irgendwelche Testdaten online stellen (möglichst minimal) bei den es einen Fehler gibt.
schlange91
User
Beiträge: 6
Registriert: Sonntag 24. Februar 2008, 19:57

Ja es gibt ja keine Fehler er sortiert halt nur falsch.
BlackJack

@schlange91: Was meinst Du denn jetzt genau? An dem Algorithmus ist nichts falsch, das ist ein korrekter Selectionsort. Der ist halt instabil. Wenn Du's stabil haben willst, dann musst Du entweder den Selectionsort erweitern, oder einen Algorithmus verwenden, der von Haus aus stabil ist. Oder ein weiteres Argument entgegennehmen: Entweder eine Vergleichsfunktion oder eine Schlüsselfunktion, wie dass beim `list.sort()` auch gemacht wird. Dann kannst Du in einem Durchgang sortieren.
schlange91
User
Beiträge: 6
Registriert: Sonntag 24. Februar 2008, 19:57

ok danke
Antworten