liste mit 2er tupel subtrahieren

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

Beitragvon BlackJack » Donnerstag 4. September 2008, 15:14

@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.
The Peacemaker
User
Beiträge: 17
Registriert: Freitag 23. Mai 2008, 17:55

Beitragvon The Peacemaker » Donnerstag 4. September 2008, 15:29

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.
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

Beitragvon Lonestar » Donnerstag 4. September 2008, 15:31

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:


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

Beitragvon abgdf » Donnerstag 4. September 2008, 17:09

@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ß
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Beitragvon yipyip » Donnerstag 4. September 2008, 17:29

Falls noch jemand daran interessiert ist (und ich das Problem richtig verstanden habe), hier meine Loesung:

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

:wink:
yipyip
The Peacemaker
User
Beiträge: 17
Registriert: Freitag 23. Mai 2008, 17:55

Beitragvon The Peacemaker » Donnerstag 4. September 2008, 20:04

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.

:?
BlackJack

Beitragvon BlackJack » Donnerstag 4. September 2008, 21:15

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.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Beitragvon yipyip » Donnerstag 4. September 2008, 21:19

Sorry, schwerer, logischer Index-Fehler meinerseits:
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)]


ist 'idx' nach dem ersten Durchlauf gleich 1, erzeugt beim naechsten Schleifendurchlauf also
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


Sieht jetzt ein bisschen wie ein Workaround aus, halte ich bei der Aufgabenstellung aber trotzdem nicht fuer das Allerschlechteste.
:oops: :wink:
yipyip
Zuletzt geändert von yipyip am Donnerstag 4. September 2008, 21:43, insgesamt 1-mal geändert.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Beitragvon yipyip » Donnerstag 4. September 2008, 21:20

ups, BlackJack war schon da...
The Peacemaker
User
Beiträge: 17
Registriert: Freitag 23. Mai 2008, 17:55

Beitragvon The Peacemaker » Freitag 5. September 2008, 14:54

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 5. September 2008, 15:14

The Peacemaker hat geschrieben:Wie kann ich jetzt die 2. Elemente der Tupel auslesen und in eine neue Liste schreiben?


Meinst du sowas?

Code: Alles auswählen

import itertools, operator
zweite = itertools.imap(operator.itemgetter(1), lst1)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
abgdf

Beitragvon abgdf » Freitag 5. September 2008, 16:30

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ß
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Freitag 5. September 2008, 16:57

abgdf hat geschrieben:Ich glaube nicht, daß er das meint, das ist doch viel zu kompliziert.

Das ist nichts kompliziert dran.

Code: Alles auswählen

lst = [(1, 2), (2, 3), (4, 5)]

new = []
for elem in lst:
    a, b = elem
    new.append(b)


Wo ist das denn einfacher?

Oder in halbwegs akzeptable:

Code: Alles auswählen

new = [b for a, b in lst]

Wobei auch bei dem Beispiel wieder der eigentlich Sinn der Aktion "versteckt"
wird. Ein "baue eine neue Liste aus den Ergebnissen von 'nehme das zweite
Element'" finde ich da passender.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder