liste mit 2er tupel subtrahieren
@The Peacemaker: Aber in der *ersten* Liste sind die Indexe in den Tupeln einfach nur überflüssig. In meiner letzten Lösung entferne ich die vorher und füge sie hinterher wieder hinzu. Ist also nur zusätzliche Arbeit.
-
- User
- Beiträge: 17
- Registriert: Freitag 23. Mai 2008, 17:55
BlackJack hat geschrieben:@The Peacemaker: Und *noch einmal* die Frage: Was soll bei Lücken vor dem ersten Wert passieren? Es kann doch nicht so schwer sein diese Frage mal zu beantworten!? Wo kommt die (0,0) in Deinem Ergebnis her? Also insbesondere der zweite Wert. Sollen die Werte vor dem ersten Index einfach mit 0en versehen werden, oder braucht man dafür irgendwie die erste Liste?
tut mir leid, das hab ich wohl beim editieren gelöscht.
ich dachte mir dass er da einfach ne 0 reinschreiben soll. das ist auch nicht so schlimm, da die ergebnisse erst interessant werden wenn sich in liste2 was tut.
eure ergebnisse funktionieren gut, vielen dank erstmal dafür. ich hab nur noch das problem dass eine meiner listen für liste2 "IndexError: list index out of range" produziert, ich bin noch dabei herauszufinden wieso.
ja, das die Funktionen hier übertrieben sind ist mir nu aber auch aufgefallen. Allerdings habe ich mir angewöhnt sobald ich eine Redundanz bei Berechnungen habe diese direkt in eine externe Funktion auszulagern. Sowas wurde bei mir einfach viel zu oft unglaublich unübersichtlich - und wenn ich mich dann mal entschliessen konnte etwas auszulagern hab ich schon öfters selber nicht mehr auf Anhieb ganz durchgeblickt...BlackJack hat geschrieben:
@Lonestar: Die beiden Funktionen sind etwas übertrieben, sogar in C wären sie das. Insbesondere `comp_index()` was eigentlich auch nur ein Einzeiler wäre:
So habe ich zwar ab und an einige Funktionen die man sich sparen könnte - aber es wird dadurch halt nicht wirklich schlechter lesbar.
Allerdings werde ich mich heute Abend mal bei Gelegenheit hinsetzen und mir mit Verstand ansehen wie es in python auch in schön geht - vor allem enumerate und map könnten mir das Leben glaube ich wesentlich erleichtern
@Lonestar: Natürlich hätte ich auch mit der xrange()-Schleife gearbeitet, wenn es mehr als 2 Listen gewesen wären.
@audax: Natürlich verwende ich in Python auch Module, wenn es der einfachste Weg ist.
Dein Code ist auch doof. Ich hol' gleich meinen großen Bruder, und der wirft mit Sand.
@The Peacemaker: Erst wenn Dir klar ist, was Du ausdrücken willst, kann man das in Code umsetzen.
Gruß
@audax: Natürlich verwende ich in Python auch Module, wenn es der einfachste Weg ist.
Dein Code ist auch doof. Ich hol' gleich meinen großen Bruder, und der wirft mit Sand.
@The Peacemaker: Erst wenn Dir klar ist, was Du ausdrücken willst, kann man das in Code umsetzen.
Gruß
Falls noch jemand daran interessiert ist (und ich das Problem richtig verstanden habe), hier meine Loesung:
yipyip
Code: Alles auswählen
def sub_lists(ls1, ls2):
default = 0
idx = 0
for x1, y1 in ls1:
x2, y2 = ls2[idx]
if x1 == x2:
default = y2
idx += 1
yield x1, y1 - default
ls1 = [(0, 1), (1, 0.5), (2, 0.1 ), (3, 0.4), (4, 0.2 ), (5, 0.6)]
ls2 = [(1, 0.1), (5, 0.1)]
print list(sub_lists(ls1, ls2))
yipyip
-
- User
- Beiträge: 17
- Registriert: Freitag 23. Mai 2008, 17:55
also eure lösungen sind alle super, bin euch sehr dankbar!
ich hab nur eine interessante beobachtung gemacht.
bei manchen listen bekomm ich:
Traceback (most recent call last):
File "C:\Studienarbeit\Modul3.py", line 242, in <module>
print list(sub_lists(ls1, ls2))
File "C:\Studienarbeit\Modul3.py", line 223, in sub_lists
x2, y2 = ls2[idx]
IndexError: list index out of range
der fehler tritt z.B. dann auf wenn in der 2. liste das letzt element (x, 0.0) ist.
hat jmd von euch ne erklärung dafür?
kann es damit zusammenhängen dass die listen sehr lang sind? wenn ich z.B. die liste ls2 = [(1, 0.1), (5, 0.1)] nehm, und als erste liste nehm ich eine mit ca. 10000 einträgen, kommt die meldung auch.
ich hab nur eine interessante beobachtung gemacht.
bei manchen listen bekomm ich:
Traceback (most recent call last):
File "C:\Studienarbeit\Modul3.py", line 242, in <module>
print list(sub_lists(ls1, ls2))
File "C:\Studienarbeit\Modul3.py", line 223, in sub_lists
x2, y2 = ls2[idx]
IndexError: list index out of range
der fehler tritt z.B. dann auf wenn in der 2. liste das letzt element (x, 0.0) ist.
hat jmd von euch ne erklärung dafür?
kann es damit zusammenhängen dass die listen sehr lang sind? wenn ich z.B. die liste ls2 = [(1, 0.1), (5, 0.1)] nehm, und als erste liste nehm ich eine mit ca. 10000 einträgen, kommt die meldung auch.
Ja da gibt's 'ne ganz einfache Erklärung für. Und die solltest Du wirklich selber heraus finden und es hat auch nichts mit besonders langen Listen zu tun. Wenn Du den Quelltext nicht in soweit nachverfolgen kannst um das Problem zu sehen, solltest Du vielleicht keine Studienarbeit mit einer Programmiersprache in Angriff nehmen.
Mach Dir klar was die Fehlermeldung bedeutet, wie die bei der gezeigten Zeile auftreten kann, und wie es dazu kommt.
Mach Dir klar was die Fehlermeldung bedeutet, wie die bei der gezeigten Zeile auftreten kann, und wie es dazu kommt.
Sorry, schwerer, logischer Index-Fehler meinerseits:
Schon bei
ist 'idx' nach dem ersten Durchlauf gleich 1, erzeugt beim naechsten Schleifendurchlauf also
den Index-Error.
So aber:
Sieht jetzt ein bisschen wie ein Workaround aus, halte ich bei der Aufgabenstellung aber trotzdem nicht fuer das Allerschlechteste.
yipyip
Schon bei
Code: Alles auswählen
ls1 = [(0, 1), (1, 0.5), (2, 0.1 ), (3, 0.4), (4, 0.2 ), (5, 0.6)]
ls2 = [(0, 1)]
den Index-Error.
So aber:
Code: Alles auswählen
def sub_lists(ls1, ls2):
default = 0
idx = 0
max_idx = len(ls2) - 1
for x1, y1 in ls1:
x2, y2 = ls2[idx]
if x1 == x2:
default = y2
idx = min(max_idx, idx + 1)
yield x1, y1 - default
yipyip
Zuletzt geändert von yipyip am Donnerstag 4. September 2008, 21:43, insgesamt 1-mal geändert.
-
- User
- Beiträge: 17
- Registriert: Freitag 23. Mai 2008, 17:55
Ich bin Programmieranfänger, und habe mir in letzter Zeit extrem viel selbst beigebracht. Aber wie ihr euch denken könnt fängt man nicht gleich als Profi an, und da denke ich nicht dass es falsch ist mal nachzufragen, wenn man mal selbst nicht weiterkommt. Ausserdem ist das nur ein winziger Teil des Programms, und der Hauptaspekt der Arbeit liegt ohnehin in der Evaluierung der Ergebnisse.
Mein Programm tut jetzt wunderbar, hab noch einige Sachen angeglichen.
Hätte noch ne letzte Frage:
Wie kann ich jetzt die 2. Elemente der Tupel auslesen und in eine neue Liste schreiben?
Mit Strings hab ichs schon vor einigen Tagen hinbekommen, da konnte ich die ersten Elemente problemlos löschen, aber mit den Floats will das nicht so ganz.
Mein Programm tut jetzt wunderbar, hab noch einige Sachen angeglichen.
Hätte noch ne letzte Frage:
Wie kann ich jetzt die 2. Elemente der Tupel auslesen und in eine neue Liste schreiben?
Mit Strings hab ichs schon vor einigen Tagen hinbekommen, da konnte ich die ersten Elemente problemlos löschen, aber mit den Floats will das nicht so ganz.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Meinst du sowas?The Peacemaker hat geschrieben:Wie kann ich jetzt die 2. Elemente der Tupel auslesen und in eine neue Liste schreiben?
Code: Alles auswählen
import itertools, operator
zweite = itertools.imap(operator.itemgetter(1), lst1)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ich glaube nicht, daß er das meint, das ist doch viel zu kompliziert.
@The Peacemaker:
Tuples sind unveränderliche Listen, Du kannst da nichts draus löschen. Wenn Du veränderliche Listen brauchst, benutze list ([]).
Da kannst Du z.B. "list.append(element)" machen (s.o.).
Gruß
@The Peacemaker:
Tuples sind unveränderliche Listen, Du kannst da nichts draus löschen. Wenn Du veränderliche Listen brauchst, benutze list ([]).
Da kannst Du z.B. "list.append(element)" machen (s.o.).
Gruß
Das ist nichts kompliziert dran.abgdf hat geschrieben:Ich glaube nicht, daß er das meint, das ist doch viel zu kompliziert.
Code: Alles auswählen
lst = [(1, 2), (2, 3), (4, 5)]
new = []
for elem in lst:
a, b = elem
new.append(b)
Oder in halbwegs akzeptable:
Code: Alles auswählen
new = [b for a, b in lst]
wird. Ein "baue eine neue Liste aus den Ergebnissen von 'nehme das zweite
Element'" finde ich da passender.