Seite 1 von 1

kurze Frage

Verfasst: Donnerstag 8. August 2013, 15:34
von peter99
Eine schnelle Frage:
In meinem Code habe ich ein statement mit 2 Liste: etwas wie
for a, b in zip(cavlist, factor):
do this
... nun moechte ich aber, dass die beiden ersten Elemente der Liste eine andere Behandlung erfahren. gibt es einen Weg das elegant zu tun?
dh. fuer die ersten elemente cavlist[0] and factor[0]
do that

Alles Liebe,
Peter

Re: kurze Frage

Verfasst: Donnerstag 8. August 2013, 16:18
von cofi
Kurze Antwort: Erstelle Threads mit einem aussagekraeftigen Titel.

Nun der eleganteste Weg ist die Elemente aus der Liste zu entfernen:

Code: Alles auswählen

first_cav, first_factor = cavlist.pop(0), factor.pop(0)
for cav, factor in zip(cavlist, factor):
    ...

Re: kurze Frage

Verfasst: Donnerstag 8. August 2013, 16:24
von peter99
ja, das mache ich gerade in meinem code, aber das wird dann etwas lang..

Code: Alles auswählen

from math import*

betaS = 0.041
geff = 0.067539767
#big letter because lambda seems to be predefined
Lambda = 3.724129913
phi = -20*pi/180
i = 17
A = 37


cavlist = (23, 24, 24, 23, 23)
factor = (0.7943, 0.8686, 0.9603, 1.0145)
# first calculate Energy for the first cavity(because there's just energy of RFQ
#then loop for other cavitie
#calculate v (kinetic energy), later use relativistic mass??
v = sqrt(2*600*1.602177*10**(-19)/(A*1.6726*10**-27))
c = 299792458
beta = v/c
T = sin(pi*geff/(beta*Lambda))/(pi*geff/(beta*Lambda))*sin(pi*betaS/(2*beta))
E0 = 600*A + i*27.98*cavlist[0]/factor[0]*cos(phi)
cavlist1 = cavlist - cavlist[0]
factor1 = factor - factor[0]
for a, b in (cavlist1, factor1):
    v = sqrt(2*E0*1.602177*10**(-19)/(A*1.6726*10**-27))         
    beta = v/c
    T = sin(pi*geff/(beta*Lambda))/(pi*geff/(beta*Lambda))*sin(pi*betaS/(2*beta))
    E0 = E0 + i*27.98*a/b*cos(phi)
                                                               
E0 ist die Energie, welche sich fuer die ersten Elemente anders berechnet, aber T ist z.B. gleich, der for loop startet jedoch erst ab dem 2. Element und so ist das ein recht langer code.. :| aber vielen dank. noch irgendeine idee?

Re: kurze Frage

Verfasst: Donnerstag 8. August 2013, 16:25
von peter99
und sorry wegen des Titels, hab mir das gedacht, nachdem ichs gepostet habe- bin grade etwas zu sehr in meinem code:)

Re: kurze Frage

Verfasst: Donnerstag 8. August 2013, 16:30
von BlackJack
@peter99: Vorher einen Iterator erzeugen und von dem mit `next()` das erste Paar nehmen und danach mit einer ``for``-Schleife über den Iterator.

Code: Alles auswählen

values = izip(cavlist, factors)
a, b = next(values)
# Do something with `a` and `b`.
for a, b in values:
    # ...
Wobei `izip` aus dem `itertools`-Modul ist und bei Python 3 durch das normale `zip()` ersetzt werden muss.

Re: kurze Frage

Verfasst: Donnerstag 8. August 2013, 16:51
von peter99
ich habe python 2.7
muss ich dafuer das package itertools importieren?

Re: kurze Frage

Verfasst: Donnerstag 8. August 2013, 16:55
von snafu
peter99 hat geschrieben:muss ich dafuer das package itertools importieren?
Ja. Wenn du `izip()` nutzen willst, dann musst du das `itertools`-Modul importieren. So wie du für jede Funktionalität aus einem Modul dieses Modul (bzw den entsprechenden Namen) erstmal importieren musst.

Im Übrigen würde auch das `zip()` aus Python 2.x gehen, was allerdings eine Liste statt eines Iterators erzeugt und daher dein Programm um 3 Nanosekunden langsamer machen könnte...

Nee, im Ernst: Wenn du große Datensätze hast, dann ist `izip()` schon empfehlenswert.

EDIT: Achso. Du brauchst den Iterator ja für `next()`. Na, dann nimm halt `izip()` oder die gezeigte Lösung mit `.pop(0)`.

Re: kurze Frage

Verfasst: Donnerstag 8. August 2013, 18:47
von cofi
Laenge ist bei dem Code das kleinste Problem.

Wenn du die Daten nur einmal benutzt, ist die Iterator-Loesung auf jeden Fall besser, da nicht der Rest der Liste verschoben werden muss.