PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleine Python Code HIlfe.....



Mat
05-02-2005, 17:21
Hallo Allerseits,
ich habe einen Auszug aus meinem Code der mir Schwierigkeiten bereitet...
ich habe ihn so abgeändert.

es ist python code:

cmp = ["A",2]
ref_list = [["A",2],["A",3],["A",6],["F",8]]

dup = False
for tupel in ref_list:

if ((cmp[0] == tupel[0]) & (dup == False)):
if cmp[1] == tupel[1]:
dup = True
print "OK"
ref_list.remove(tupel)
continue
if cmp[1] != tupel[1]:
print "DIFFERENT"
ref_list.remove(tupel)
continue

if ((cmp[0] == tupel[0]) & (dup == True)):
if cmp[1] == tupel[1]:
ref_list.remove(tupel)
continue
if cmp[1] != tupel[1]:
print "DIFFERENT DUPLICATE"
ref_list.remove(tupel)
continue

Was ich nun erwarten würde ist eine Ausgabe von
OK
DIFFERENT DUPLICATE
DIFFERENT DUPLICATE

Es kommt aber nur
OK
DIFFERENT DUPLICATE

ich habe bemerkt dass wenn ich zwei mal in der ref_list ein tupel hintereinander mit demselben Buchstaben, in diesem Fall "A", eintrage er einfach bei der Bearbeitung des ersten "A" gleich danach zum dritten springt.
Er läuft einfach nicht alle Elemente der Liste durch sondern überspringt eines.

Ich versuche seit 2 Tagen das Problem zu beheben...

Es wäre sehr nett wenn mir jemand Hilfe leisten könnte.

P.S.:
Das Programm soll tun:

nur einmal OK ausgeben wenn die Tupel identisch sind und alle weiteren identsichen Tupel nicht ausgeben, aber alle weiteren Tupel die sich nur im Wert also dem Integer unterscheiden als DIFFERENT DUPLICATE ausgeben.
Falls zuerst DIFFERENT auftritt dann einfach DIFFERENT ausgeben udn dann evtl wenn die Tupel identisch sind einfach OK Aber alle nach dem OK Tupel wieder als DIFFERENT DUPLICATE oder gar nicht.

DANKE

Mat
05-02-2005, 17:23
Sorry ffürs doppelposting der Code ist unlesbar:



cmp = ["A",2]
ref_list = [["A",2],["A",3],["A",6],["F",8]]

dup = False
for tupel in ref_list:
print ref_list
if ((cmp[0] == tupel[0]) & (dup == False)):
if cmp[1] == tupel[1]:
dup = True
print "OK"
ref_list.remove(tupel)
continue
if cmp[1] != tupel[1]:
print "DIFFERENT"
ref_list.remove(tupel)
continue

if ((cmp[0] == tupel[0]) & (dup == True)):
if cmp[1] == tupel[1]:
ref_list.remove(tupel)
continue
if cmp[1] != tupel[1]:
print "DIFFERENT DUPLICATE"
ref_list.remove(tupel)
continue

foobarflu
05-02-2005, 19:47
moin,

wenn ich mich Recht erinnere arbeitet diese for intern über eine Zählvariable und indem Du ein Element löscht bringst Du das durcheinander.
Wenn Du bestimmte Elemente einer Liste selektieren willst ist ein filter() mit einer entsprechenden lambda meist die beste Lösung

btw... elif und else existieren ;)

Willst Du die Liste ohne doppelt vorkommende Elemente?

Mat
06-02-2005, 16:15
Hmm Danke für die Antwort....
naja.....was interessant ist, ist dass wenn ich keine zwei gleiche aufeinanderfolgende Elemente habe dieses Problem nicht passiert. Sondern erst wenn ich zwei Buchstaben "A" in diesem Fall hintereinander in die Liste gebe dann die Forschleife eben das zweite irgendwie überspringt also gar nicht abarbeitet.
Die Liste mit nur [["A",2]["A",2]] würde nur einmal eine Iteration hervorrufen was ich sehr seltsam finde....
Zumindest bei dem Programm.

Was ich will ist was ganz anderes aber mein Problem besteht eben darin dass wenn ich zwei aufeinanderfolgende gleiche Elemente habe das Duplikat eben nicht genommen wird....

Trotzdem danke euch

Mat
06-02-2005, 17:19
Ja es liegt wirklich am removen....ohne gehts....
leider muss ich die liste kürzen immer um das element dass ich bearbeitet habe.....
hmm wie kann ich das denn anderweitig realisieren?

Hans-Georg Normann
06-02-2005, 21:04
Kannst du for - Schleife nicht gegen while austauschen? Wenn das geht, dann würde ich so vorgehen Anzahl der Elemente (TUPEL) ermitteln
While - Schleife vom letzten zum ersten Element durchlaufen lassen.
Das jeweils gültige Element im Bedarfsfall löschen.

Hans

foobarflu
07-02-2005, 09:35
leider muss ich die liste kürzen immer um das element dass ich bearbeitet habe.....

Du willst rücksichtslos alle Tupel rausschmeissen, deren erstes Element gleich dem ersten des Referenztupels ist und nur noch die Elemente in der Liste haben, bei denen das nicht der Fall ist? Nichts leichter als das...



def eliminate(list, tup):
return filter(lambda t: t[0] != tup[0], list)

cmp = ["A",2]
ref_list = [["A",2],["A",3],["A",6],["F",8]]

print eliminate(ref_list, cmp)

Oder hast Du anstelle der print-Statements sinnvollen Code stehen?

Mat
07-02-2005, 15:50
Danke euch für eure HIlfe!

Ja mit while habe ich es jetzt nicht probiert, ich habe aber mein Problem gelöst....hab mir nen bool wert mitschleppen lassen für jedes Tupel und am Ende über alle die dem einen angehörten rausgeschmissen....weil ich noch viel mehr Operationen in der for-schleife stehen hab und andere Dinge....
ganz so einfach wie nur rausschmeißen ists leider net @foo....

Trotzdem Danke euch!!!

Werde nie wieder in einer for Schleife aus einer LIste removen ;O)

fs111
08-02-2005, 18:44
Warum macht ihr das so lang? ;)



cmp = ["A","2"]
reflist = [["A",2],["A",3],["A",6],["F",8]]
result = [elem for elem in reflist if elem[0] != cmp[0]]


fs111

P.S.:

@foobarflu

Das sind keine Tupel, sondern Listen.