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
kurze Frage
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Kurze Antwort: Erstelle Threads mit einem aussagekraeftigen Titel.
Nun der eleganteste Weg ist die Elemente aus der Liste zu entfernen:
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):
...Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
ja, das mache ich gerade in meinem code, aber das wird dann etwas lang..
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?
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)
-
BlackJack
@peter99: Vorher einen Iterator erzeugen und von dem mit `next()` das erste Paar nehmen und danach mit einer ``for``-Schleife über den Iterator.
Wobei `izip` aus dem `itertools`-Modul ist und bei Python 3 durch das normale `zip()` ersetzt werden muss.
Code: Alles auswählen
values = izip(cavlist, factors)
a, b = next(values)
# Do something with `a` and `b`.
for a, b in values:
# ...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.peter99 hat geschrieben:muss ich dafuer das package itertools importieren?
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)`.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
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.
Wenn du die Daten nur einmal benutzt, ist die Iterator-Loesung auf jeden Fall besser, da nicht der Rest der Liste verschoben werden muss.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
