Listen

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
tany3
User
Beiträge: 20
Registriert: Mittwoch 7. März 2012, 10:32

Hey zusammen,

Ich haben eigentlich ganz simples Problem dass ich in Python irgendwie nicht gelöst bekomme undzware möchte ich in einer Liste mithilfe einer For-Schleife das i+1'te Element und das i'te Element herausnehmen und die Differenz errechnen. In Java hätte ich irgendwie so etwas gemacht :

Code: Alles auswählen

For (i=0,i<n,i++) {
   fk = Liste[i+1]-Liste[i]
}
Oder so ähnlich... Jetzt hab ich in Python das hier probiert :

Code: Alles auswählen

funktionsanfang=0
funktionsname=0
funktionsliste=[]
vollstaendigeFunktionsListe=[]
i=0
j=1
for function_ea in Functions(SegStart(ea), SegEnd(ea)):

   funktionsname=str(GetFunctionName(function_ea))
   funktionsanfang=(("%i")%(function_ea))
   funktionsliste.append(("Funktionsname:",funktionsname,"\n",
                          "Funktionsanfang:",funktionsanfang))
   for i in funktionsliste:
       funktionsgroesse=funktionsliste[j]-funktionsliste[i]
       vollstaenidgeFunktionsListe.append(("Funktionsname:",funktionsname,"\n",
                                           "Funktionsanfang:",funktionsanfang,"\n",
                                           "Funktionsgroesse:",funktionsgroesse,"\n"))
       i+=1
       j+=1
print vollstaendigeFunktionsListe
In

Code: Alles auswählen

funktionsgroesse=funktionsliste[j]-funktionsliste[i]
Habe ich schon probiert gehabt vorher mit i+1 und i in den Indizes aber das wollte nicht so recht dann habe ich probiert dass ich halt i und j nehme und beide immer inkrementiere aber da bekomme ich egal was passiert immer "IndexError: list index out of range" ...

Was stimmt denn da nicht ?

Schönen Abend noch , tany3
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Du solltest uns lieber ein minimales Beispiel zeigen. Und Python ist nicht Java. ;-)

Das Hauptproblem ist, dass du erstens „for“-Schleifen in Python noch nicht ganz verstanden hast, und dass du schon versuchst, auf das zweite Element zuzugreifen, nachdem du erst eines hinzugefügt hast.

In Python wird bei „for“-Schleifen über die Elemente eines „Iterators“ iteriert. Bei „for i in funktionsliste“ wird also nicht ein Counter hochgezählt sondern „i“ ist immer ein Element von „funktionsliste“. Der „pythonische“ Ansatz das zu lösen wäre ganz anders, aber du möchtest vielleicht dir selber noch was ausdenken.

Deine Bezeichner sind übrigens viel zu lang, in dem Code ist mindestens schon ein Rechtschreibfehler … PEP 8 ist auch lesenswert.
tany3
User
Beiträge: 20
Registriert: Mittwoch 7. März 2012, 10:32

nomnom hat geschrieben:Du solltest uns lieber ein minimales Beispiel zeigen. Und Python ist nicht Java. ;-)

Das Hauptproblem ist, dass du erstens „for“-Schleifen in Python noch nicht ganz verstanden hast, und dass du schon versuchst, auf das zweite Element zuzugreifen, nachdem du erst eines hinzugefügt hast.

In Python wird bei „for“-Schleifen über die Elemente eines „Iterators“ iteriert. Bei „for i in funktionsliste“ wird also nicht ein Counter hochgezählt sondern „i“ ist immer ein Element von „funktionsliste“. Der „pythonische“ Ansatz das zu lösen wäre ganz anders, aber du möchtest vielleicht dir selber noch was ausdenken.

Deine Bezeichner sind übrigens viel zu lang, in dem Code ist mindestens schon ein Rechtschreibfehler … PEP 8 ist auch lesenswert.
Hmm Hast du vielleicht ein Beispiel oder so etwas ? Es muss auch nicht exakt das aus meinem Code sein nur damit ich dann theoretisch anwenden könnte auf meins ich mach es dann auch selbst :D
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

http://docs.python.org/tutorial/control ... statements

Code: Alles auswählen

>>> for i in [1, 3, 3, 7]: # über eine Liste iterieren
...     print i
... 
1
3
3
7
>>> for c in 'Hallo!': # über String iterieren
...     print c
... 
H
a
l
l
o
!
>>> for i, j in enumerate([1, 3, 3, 7]): # über ein "enumerate"-Objekt iterieren
...     print '%d: %d' % (i, j)
...
0: 1
1: 3
2: 3
3: 7
>>> 
Zuletzt geändert von nomnom am Freitag 23. März 2012, 21:11, insgesamt 1-mal geändert.
tany3
User
Beiträge: 20
Registriert: Mittwoch 7. März 2012, 10:32

nomnom hat geschrieben:

Code: Alles auswählen

>>> for i in [1, 3, 3, 7]: # über eine Liste iterieren
...     print i
... 
1
3
3
7
>>> for c in 'Hallo!': # über String iterieren
...     print c
... 
H
a
l
l
o
!
>>> 
:D Das hab ich verstanden ich glaube wir reden aneinander vorbei hehe :D Ich meinte ... angenommen auf deinen Fall angewandt, ich möchte jetzt 7 - 3 rechnen , also das 3. - das 2. Element wenn der Index bei 0 beginnt. Aber ich weiß nicht was in der Liste steht oder wie groß sie ist ich weiß nur sie besteht aus lauter Integer im 1000er Bereich ... Hast du da eine Idee ?
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Hab meinen Beitrag gerade noch mal erweitert. Man kann auch über Listen von Listen iterieren und so kann man dann immer zwei Elemente auf einmal benutzen. Aber das hilft dir wohl noch nicht viel. Schau dir mal zip an!
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Ich verstehe nicht ganz den Sinn deines anfänglich genannten Java-Beispiels. Herausgenommen (im Sinne von aus einer Liste entfernt) wird ja nichts und lediglich die Differenz zweier aufeinanderfolgender Werte zu errechnen ohne was damit zu tun, erscheint mir ebenfalls fraglich (denn die Ergebnisse werden ja so noch nicht einmal akkumuliert). Was soll also genau das endgültige Ziel deines Codes sein?
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

tany3 hat geschrieben: In Java hätte ich irgendwie so etwas gemacht:

Code: Alles auswählen

For (i=0,i<n,i++) {
   fk = Liste[i+1]-Liste[i]
}
In Python würde ich das Rezept aus der Dokumentation von itertools verwenden:

Code: Alles auswählen

def pairwise(iterable):
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)
Und dann:

Code: Alles auswählen

for a, b in pairwise(some_list):
    print b - a
In specifications, Murphy's Law supersedes Ohm's.
tany3
User
Beiträge: 20
Registriert: Mittwoch 7. März 2012, 10:32

pillmuncher hat geschrieben:
tany3 hat geschrieben: In Java hätte ich irgendwie so etwas gemacht:

Code: Alles auswählen

For (i=0,i<n,i++) {
   fk = Liste[i+1]-Liste[i]
}
In Python würde ich das Rezept aus der Dokumentation von itertools verwenden:

Code: Alles auswählen

def pairwise(iterable):
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)
Und dann:

Code: Alles auswählen

for a, b in pairwise(some_list):
    print b - a

"TypeError: unsupported operand type(s) for -: 'tuple' and 'tuple'"


@webspider:

Das Java Beispiel war jetzt auch nicht unbedingt vollständig es ging nur darum was ich theoretisch erreichen will aber ich will es noch einmal erklären.Angenommen ich habe eine Liste lauter Integers von denen ich nichts weiß außer dass sie existieren und dass es lauter Ints sind .

Liste[a,b,d,e,f,g,h,i,j,k,l...z]

Jetzt möchte ich eine Schleife die die gesamte Liste durchgeht und in einer Variablen XY speichert was b -a , d - b ... z-y ist
Also so etwas wie :

i=0
FK = Liste[i+1] - Liste
i++

Das das so nicht funktioniert habe ich auch verstanden jetzt aber ich suche nach einer Möglichkeit das zu realisieren in Python.
BlackJack

Wenn Du die Fehlermeldung bekommst, dass Du keine Tupel voneinander abziehen kannst, dann sind in Deiner Liste Tupel und keine ganzen Zahlen:

Code: Alles auswählen

In [114]: %cpaste
Pasting code; enter '--' alone on the line to stop.
:def pairwise(iterable):
:    a, b = tee(iterable)
:    next(b, None)
:    return izip(a, b)
:--

In [115]: for a, b in pairwise([1, 3, 3, 7]):
   .....:     print b - a
   .....: 
2
0
4
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

tany3 hat geschrieben:Jetzt möchte ich eine Schleife die die gesamte Liste durchgeht und in einer Variablen XY speichert was b -a , d - b ... z-y ist
Die Sache ist nur, dass du bei jedem Schleifendurchgang der Variablen einen anderen Wert zuweisen würdest, nach dem kompletten Durchlauf wäre also an FK lediglich z - y gebunden. Weswegen ich frage was du vorhast mit den ermittelten Differenzen zu tun. Sie alle in eine Liste packen? Dafür würden sich Lösungen mit itertools geradezu anbieten. Falls nicht, wäre ein anderer Ansatz eine Überlegung wert.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

tany3 hat geschrieben:
pillmuncher hat geschrieben:

Code: Alles auswählen

def pairwise(iterable):
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)
Und dann:

Code: Alles auswählen

for a, b in pairwise(some_list):
    print b - a

"TypeError: unsupported operand type(s) for -: 'tuple' and 'tuple'"
Naja, wenn du Tupel als Listen-Elemente hast, dann ist deine Ausgangsfrage ziemlich sinnlos. Was denkst du denn, was die Differenz zweier Tupel sein könnte? Zeig doch mal, wie du die Liste befüllst. Ich vermute, da ist schon was verkehrt, wenn du als Elemente Zahlen erwartest, aber am Ende Tupel drin sind.
tany3 hat geschrieben:Das Java Beispiel war jetzt auch nicht unbedingt vollständig es ging nur darum was ich theoretisch erreichen will aber ich will es noch einmal erklären.Angenommen ich habe eine Liste lauter Integers von denen ich nichts weiß außer dass sie existieren und dass es lauter Ints sind .

Liste[a,b,d,e,f,g,h,i,j,k,l...z]

Jetzt möchte ich eine Schleife die die gesamte Liste durchgeht und in einer Variablen XY speichert was b -a , d - b ... z-y ist
Also so etwas wie :

i=0
FK = Liste[i+1] - Liste
i++

Das das so nicht funktioniert habe ich auch verstanden jetzt aber ich suche nach einer Möglichkeit das zu realisieren in Python.
Na so halt:

Code: Alles auswählen

new_list = [b - a for a, b in pairwise(old_list)]
Vorausgesetzt, die Elemente von old_list sind subtrahierbar und mithin keine Tupel.
Zuletzt geändert von pillmuncher am Freitag 23. März 2012, 23:35, insgesamt 1-mal geändert.
In specifications, Murphy's Law supersedes Ohm's.
tany3
User
Beiträge: 20
Registriert: Mittwoch 7. März 2012, 10:32

webspider hat geschrieben:
tany3 hat geschrieben:Jetzt möchte ich eine Schleife die die gesamte Liste durchgeht und in einer Variablen XY speichert was b -a , d - b ... z-y ist
Die Sache ist nur, dass du bei jedem Schleifendurchgang der Variablen einen anderen Wert zuweisen würdest, nach dem kompletten Durchlauf wäre also an FK lediglich z - y gebunden. Weswegen ich frage was du vorhast mit den ermittelten Differenzen zu tun. Sie alle in eine Liste packen? Dafür würden sich Lösungen mit itertools geradezu anbieten. Falls nicht, wäre ein anderer Ansatz eine Überlegung wert.

Genau das will ich tun , wie krieg ich das hin :D Das ist exakt was ich meinte
tany3
User
Beiträge: 20
Registriert: Mittwoch 7. März 2012, 10:32

Bin jetzt so weit aber der wirft immer noch den Fehler dass es Strangs seien , aber es sind auf jeden Fall Integers oder wird es durch die Funktion konferiert ?

Code: Alles auswählen

def pairwise(iterable):
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

funktionsanfang=0
funktionsname=0
funktionsliste=[]
vollstaendigeFunktionsListe=[]
i=0
j=1
for function_ea in Functions(SegStart(ea), SegEnd(ea)):

   funktionsanfang=(function_ea)
   funktionsliste.append("%i" %(funktionsanfang))
   for i,j in pairwise(funktionsliste):
       funktionsgroesse= j - i
       vollstaenidgeFunktionsListe.append(("Funktionsname:",funktionsname,"\n",
                                           "Funktionsanfang:",funktionsanfang,"\n",
                                           "Funktionsgroesse:",funktionsgroesse,"\n"))
       i+=1
       j+=1
print vollstaendigeFunktionsListe

TypeError: unsupported operand type(s) for -: 'str' and 'str'
problembär

tany3 hat geschrieben:undzware möchte ich in einer Liste mithilfe einer For-Schleife das i+1'te Element und das i'te Element herausnehmen und die Differenz errechnen. In Java hätte ich irgendwie so etwas gemacht :

Code: Alles auswählen

For (i=0,i<n,i++) {
   fk = Liste[i+1]-Liste[i]
}
Oder so ähnlich... Jetzt hab ich in Python das hier probiert :
Hast Du irgendeinen der bisherigen Vorschläge verstanden?

Die Jungs versuchen mal wieder um

Code: Alles auswählen

for i in range(len(Liste) - 1):
   fk = Liste[i + 1] - Liste[i]
drumrumzureden. :roll:
BlackJack

Code: Alles auswählen

In [110]: data = [1, 3, 3, 7]

In [111]: xs, ys = tee(iter(data))

In [112]: ys.next()
Out[112]: 1

In [113]: list(imap(sub, ys, xs))
Out[113]: [2, 0, 4]
`tee` und `imap` aus dem `itertools`-Modul und `sub` aus dem `operator`-Modul.
tany3
User
Beiträge: 20
Registriert: Mittwoch 7. März 2012, 10:32

BlackJack hat geschrieben:

Code: Alles auswählen

In [110]: data = [1, 3, 3, 7]

In [111]: xs, ys = tee(iter(data))

In [112]: ys.next()
Out[112]: 1

In [113]: list(imap(sub, ys, xs))
Out[113]: [2, 0, 4]
`tee` und `imap` aus dem `itertools`-Modul und `sub` aus dem `operator`-Modul.
Danke dir. Hat mein Problem zu 100% gelöst :)
Die Jungs versuchen mal wieder um

Code: Alles auswählen

for i in range(len(Liste) - 1):
   fk = Liste[i + 1] - Liste[i]
drumrumzureden.
Hat nicht funktioniert :roll: :roll: :roll: ^^
problembär

tany3 hat geschrieben:
problembär hat geschrieben:

Code: Alles auswählen

for i in range(len(Liste) - 1):
   fk = Liste[i + 1] - Liste[i]
Hat nicht funktioniert :roll: :roll: :roll: ^^
Mach' mich nicht schwach:

Code: Alles auswählen

#!/usr/bin/env python

data = [1, 3, 3, 7]

for i in range(len(data) - 1):
   fk = data[i + 1] - data[i]
   print fk
Unter Python 3.x muß es "print(fk)" heißen, also mit Klammern.

Sollte klappen.
Antworten