Seite 1 von 1
Listen
Verfasst: Freitag 23. März 2012, 20:28
von tany3
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 :
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
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
Re: Listen
Verfasst: Freitag 23. März 2012, 20:40
von nomnom
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.
Re: Listen
Verfasst: Freitag 23. März 2012, 20:54
von tany3
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

Re: Listen
Verfasst: Freitag 23. März 2012, 21:08
von nomnom
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
>>>
Re: Listen
Verfasst: Freitag 23. März 2012, 21:11
von tany3
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
!
>>>

Das hab ich verstanden ich glaube wir reden aneinander vorbei hehe

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 ?
Re: Listen
Verfasst: Freitag 23. März 2012, 21:12
von nomnom
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!
Re: Listen
Verfasst: Freitag 23. März 2012, 21:15
von webspider
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?
Re: Listen
Verfasst: Freitag 23. März 2012, 21:31
von pillmuncher
tany3 hat geschrieben: In Java hätte ich irgendwie so etwas gemacht:
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:
Re: Listen
Verfasst: Freitag 23. März 2012, 21:44
von tany3
"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.
Re: Listen
Verfasst: Freitag 23. März 2012, 21:51
von 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
Re: Listen
Verfasst: Freitag 23. März 2012, 21:53
von webspider
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.
Re: Listen
Verfasst: Freitag 23. März 2012, 21:54
von pillmuncher
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:
"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:Vorausgesetzt, die Elemente von old_list sind subtrahierbar und mithin keine Tupel.
Re: Listen
Verfasst: Freitag 23. März 2012, 22:16
von tany3
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

Das ist exakt was ich meinte
Re: Listen
Verfasst: Freitag 23. März 2012, 22:22
von tany3
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'
Re: Listen
Verfasst: Freitag 23. März 2012, 22:38
von 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 :
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.

Re: Listen
Verfasst: Freitag 23. März 2012, 22:42
von 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.
Re: Listen
Verfasst: Freitag 23. März 2012, 23:05
von tany3
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

^^
Re: Listen
Verfasst: Samstag 24. März 2012, 00:50
von 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

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