Python: "breaking out" der if-Anweisung innerhalb einer for-Schleife
Ich verstehen, dass man nicht "brechen" einer if-Anweisung und nur aus einer Schleife, aber ich versuche, konzeptionell halt eine if-Anweisung, die aus der Bewertung nach es findet ein "true" in der ersten Zeit, wenn es innerhalb einer for-Schleife.
# Import XML Parser
import xml.etree.ElementTree as ET
# Parse XML directly from the file path
tree = ET.parse('xml file')
# Create iterable item list
items = tree.findall('item')
# Create class for historic variables
class DataPoint:
def __init__(self, low, high, freq):
self.low = low
self.high = high
self.freq = freq
# Create Master Dictionary and variable list for historic variables
masterDictionary = {}
# Loop to assign variables as dictionary keys and associate their values with them
for item in items:
thisKey = item.find('variable').text
thisList = []
masterDictionary[thisKey] = thisList
for item in items:
thisKey = item.find('variable').text
newDataPoint = DataPoint(float(item.find('low').text), float(item.find('high').text), float(item.find('freq').text))
masterDictionary[thisKey].append(newDataPoint)
diceDictionary = {}
import random
for thisKey in masterDictionary.keys():
randomValue = random.random()
diceList = []
thisList = []
diceList = masterDictionary[thisKey]
diceDictionary[thisKey] = thisList
for i in range(len(diceList)):
if randomValue <= sum(i.freq for i in diceList[0:i+1]):
print 'O', i, 'randomValue', randomValue, 'prob container', sum(i.freq for i in diceList[0:i+1])
#diceRoll = random.uniform(diceList[i].low, diceList[i].high)
#diceDictionary[thisKey].append(diceRoll)
else:
print 'X', i, 'randomValue', randomValue, 'prob container', sum(i.freq for i in diceList[0:i+1])
Gibt es zwei Schlüssel in der masterDictionary und jedes enthält eine Liste von 27 und 29 Datenpunkte jeweils. Daher ist die Schleife
for i in range(len(diceList)):
läuft i von 0 - 26 0 - 28 für jeden Schlüssel. Das ist großartig, aber das problem, wenn der if-Anweisung ausgewertet wird, ist, dass, sobald es gefunden wird, wird es später werden, gilt für alle der folgenden Palette Elemente. Hier ist der print-Ausgabe:
X 0 randomValue 0.0775612781213 prob container 0.0294117647059
X 1 randomValue 0.0775612781213 prob container 0.0294117647059
X 2 randomValue 0.0775612781213 prob container 0.0294117647059
X 3 randomValue 0.0775612781213 prob container 0.0294117647059
O 4 randomValue 0.0775612781213 prob container 0.147058823529
O 5 randomValue 0.0775612781213 prob container 0.235294117647
O 6 randomValue 0.0775612781213 prob container 0.441176470588
O 7 randomValue 0.0775612781213 prob container 0.588235294118
O 8 randomValue 0.0775612781213 prob container 0.676470588235
O 9 randomValue 0.0775612781213 prob container 0.764705882353
O 10 randomValue 0.0775612781213 prob container 0.794117647059
O 11 randomValue 0.0775612781213 prob container 0.823529411765
O 12 randomValue 0.0775612781213 prob container 0.823529411765
O 13 randomValue 0.0775612781213 prob container 0.852941176471
O 14 randomValue 0.0775612781213 prob container 0.882352941176
O 15 randomValue 0.0775612781213 prob container 0.882352941176
O 16 randomValue 0.0775612781213 prob container 0.911764705882
O 17 randomValue 0.0775612781213 prob container 0.911764705882
O 18 randomValue 0.0775612781213 prob container 0.911764705882
O 19 randomValue 0.0775612781213 prob container 0.911764705882
O 20 randomValue 0.0775612781213 prob container 0.911764705882
O 21 randomValue 0.0775612781213 prob container 0.941176470588
O 22 randomValue 0.0775612781213 prob container 0.941176470588
O 23 randomValue 0.0775612781213 prob container 0.970588235294
O 24 randomValue 0.0775612781213 prob container 0.970588235294
O 25 randomValue 0.0775612781213 prob container 0.970588235294
O 26 randomValue 0.0775612781213 prob container 0.970588235294
O 27 randomValue 0.0775612781213 prob container 0.970588235294
O 28 randomValue 0.0775612781213 prob container 1.0
X 0 randomValue 0.803308376497 prob container 0.0294117647059
X 1 randomValue 0.803308376497 prob container 0.0294117647059
X 2 randomValue 0.803308376497 prob container 0.0294117647059
X 3 randomValue 0.803308376497 prob container 0.0294117647059
X 4 randomValue 0.803308376497 prob container 0.0294117647059
X 5 randomValue 0.803308376497 prob container 0.0294117647059
X 6 randomValue 0.803308376497 prob container 0.0882352941176
X 7 randomValue 0.803308376497 prob container 0.0882352941176
X 8 randomValue 0.803308376497 prob container 0.0882352941176
X 9 randomValue 0.803308376497 prob container 0.117647058824
X 10 randomValue 0.803308376497 prob container 0.147058823529
X 11 randomValue 0.803308376497 prob container 0.205882352941
X 12 randomValue 0.803308376497 prob container 0.264705882353
X 13 randomValue 0.803308376497 prob container 0.294117647059
X 14 randomValue 0.803308376497 prob container 0.382352941176
X 15 randomValue 0.803308376497 prob container 0.441176470588
X 16 randomValue 0.803308376497 prob container 0.470588235294
X 17 randomValue 0.803308376497 prob container 0.470588235294
X 18 randomValue 0.803308376497 prob container 0.529411764706
X 19 randomValue 0.803308376497 prob container 0.588235294118
X 20 randomValue 0.803308376497 prob container 0.647058823529
X 21 randomValue 0.803308376497 prob container 0.764705882353
O 22 randomValue 0.803308376497 prob container 0.823529411765
O 23 randomValue 0.803308376497 prob container 0.882352941176
O 24 randomValue 0.803308376497 prob container 0.970588235294
O 25 randomValue 0.803308376497 prob container 0.970588235294
O 26 randomValue 0.803308376497 prob container 1.0
Überall gibt es ein 'X' bedeutet, dass die if-Anweisung falsch war, und einmal eine " O " beginnt, der rest der Aussagen, die immer wahr sein, weil die zunehmende Größe der prob-container (bis 1.0).
Was ich Suche, ist ein Weg, zu sagen, meine if-Anweisung innerhalb der Schleife zu stoppen, sobald es findet die erste wahre Aussage, dann schreiben Sie Wörterbuch, und dann weiter die äußere Schleife wieder.
Jede Hilfe dankbar!
UPDATE:
diceDictionary = {}
x=0
while x < 3:
import random
for thisKey in masterDictionary.keys():
randomValue = random.random()
diceList = []
thisList = []
diceList = masterDictionary[thisKey]
diceDictionary[thisKey] = thisList
for i in range(len(diceList)):
if randomValue <= sum(i.freq for i in diceList[0:i+1]):
print 'O', thisKey, i, 'randomValue', randomValue, 'prob container', sum(i.freq for i in diceList[0:i+1])
diceRoll = random.uniform(diceList[i].low, diceList[i].high)
diceDictionary[thisKey].append(diceRoll)
break
else:
print 'X', thisKey, i, 'randomValue', randomValue, 'prob container', sum(i.freq for i in diceList[0:i+1])
x = x + 1
print diceDictionary
produziert:
X inflation 0 randomValue 0.500605733928 prob container 0.0294117647059
X inflation 1 randomValue 0.500605733928 prob container 0.0294117647059
X inflation 2 randomValue 0.500605733928 prob container 0.0294117647059
X inflation 3 randomValue 0.500605733928 prob container 0.0294117647059
X inflation 4 randomValue 0.500605733928 prob container 0.147058823529
X inflation 5 randomValue 0.500605733928 prob container 0.235294117647
X inflation 6 randomValue 0.500605733928 prob container 0.441176470588
O inflation 7 randomValue 0.500605733928 prob container 0.588235294118
X stock 0 randomValue 0.392225720409 prob container 0.0294117647059
X stock 1 randomValue 0.392225720409 prob container 0.0294117647059
X stock 2 randomValue 0.392225720409 prob container 0.0294117647059
X stock 3 randomValue 0.392225720409 prob container 0.0294117647059
X stock 4 randomValue 0.392225720409 prob container 0.0294117647059
X stock 5 randomValue 0.392225720409 prob container 0.0294117647059
X stock 6 randomValue 0.392225720409 prob container 0.0882352941176
X stock 7 randomValue 0.392225720409 prob container 0.0882352941176
X stock 8 randomValue 0.392225720409 prob container 0.0882352941176
X stock 9 randomValue 0.392225720409 prob container 0.117647058824
X stock 10 randomValue 0.392225720409 prob container 0.147058823529
X stock 11 randomValue 0.392225720409 prob container 0.205882352941
X stock 12 randomValue 0.392225720409 prob container 0.264705882353
X stock 13 randomValue 0.392225720409 prob container 0.294117647059
X stock 14 randomValue 0.392225720409 prob container 0.382352941176
O stock 15 randomValue 0.392225720409 prob container 0.441176470588
X inflation 0 randomValue 0.146182475695 prob container 0.0294117647059
X inflation 1 randomValue 0.146182475695 prob container 0.0294117647059
X inflation 2 randomValue 0.146182475695 prob container 0.0294117647059
X inflation 3 randomValue 0.146182475695 prob container 0.0294117647059
O inflation 4 randomValue 0.146182475695 prob container 0.147058823529
X stock 0 randomValue 0.745100497977 prob container 0.0294117647059
X stock 1 randomValue 0.745100497977 prob container 0.0294117647059
X stock 2 randomValue 0.745100497977 prob container 0.0294117647059
X stock 3 randomValue 0.745100497977 prob container 0.0294117647059
X stock 4 randomValue 0.745100497977 prob container 0.0294117647059
X stock 5 randomValue 0.745100497977 prob container 0.0294117647059
X stock 6 randomValue 0.745100497977 prob container 0.0882352941176
X stock 7 randomValue 0.745100497977 prob container 0.0882352941176
X stock 8 randomValue 0.745100497977 prob container 0.0882352941176
X stock 9 randomValue 0.745100497977 prob container 0.117647058824
X stock 10 randomValue 0.745100497977 prob container 0.147058823529
X stock 11 randomValue 0.745100497977 prob container 0.205882352941
X stock 12 randomValue 0.745100497977 prob container 0.264705882353
X stock 13 randomValue 0.745100497977 prob container 0.294117647059
X stock 14 randomValue 0.745100497977 prob container 0.382352941176
X stock 15 randomValue 0.745100497977 prob container 0.441176470588
X stock 16 randomValue 0.745100497977 prob container 0.470588235294
X stock 17 randomValue 0.745100497977 prob container 0.470588235294
X stock 18 randomValue 0.745100497977 prob container 0.529411764706
X stock 19 randomValue 0.745100497977 prob container 0.588235294118
X stock 20 randomValue 0.745100497977 prob container 0.647058823529
O stock 21 randomValue 0.745100497977 prob container 0.764705882353
X inflation 0 randomValue 0.332170052306 prob container 0.0294117647059
X inflation 1 randomValue 0.332170052306 prob container 0.0294117647059
X inflation 2 randomValue 0.332170052306 prob container 0.0294117647059
X inflation 3 randomValue 0.332170052306 prob container 0.0294117647059
X inflation 4 randomValue 0.332170052306 prob container 0.147058823529
X inflation 5 randomValue 0.332170052306 prob container 0.235294117647
O inflation 6 randomValue 0.332170052306 prob container 0.441176470588
X stock 0 randomValue 0.145551106438 prob container 0.0294117647059
X stock 1 randomValue 0.145551106438 prob container 0.0294117647059
X stock 2 randomValue 0.145551106438 prob container 0.0294117647059
X stock 3 randomValue 0.145551106438 prob container 0.0294117647059
X stock 4 randomValue 0.145551106438 prob container 0.0294117647059
X stock 5 randomValue 0.145551106438 prob container 0.0294117647059
X stock 6 randomValue 0.145551106438 prob container 0.0882352941176
X stock 7 randomValue 0.145551106438 prob container 0.0882352941176
X stock 8 randomValue 0.145551106438 prob container 0.0882352941176
X stock 9 randomValue 0.145551106438 prob container 0.117647058824
O stock 10 randomValue 0.145551106438 prob container 0.147058823529
{'inflation': [0.028073642645577577], 'stock': [-0.07388514885974767]}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Pause wird terminate "die nächste umschließende Schleife, das überspringen der optionale else-Klausel, wenn die Schleife hat eine." Die äußere Schleife wird einfach weiter mit der nächsten iteration. Sie sind also nicht "breaking the falls", sondern die Schleife, die, wenn umschlossen ist. Vor der Pause, können Sie setzen Sie einfach alle Werte aus
diceList[0:i+1]
zudiceList[0:len(diceList)+1]
zu wahren.Einer Methode zu einer Ausnahme in der inneren Codes, und fangen Sie innerhalb der for-Schleife und fortsetzen der Schleife.
Also, was sind die Bedingungen, dass Sie wissen, die Aussage ist
True
? Ich dachte, es könnte sein, "wenn die Letzte Aussage Wahr war", aber in deinem Beispiel-Ausgabe, die Sie schließlich zurück zuFalse
?So oder so, sollten Sie erwägen, dies als eine Art der ersten Bedingung if:
Wenn der erste Teil als Falsch ausgewertet wird (d.h., Sie bereits wissen es ' s
True
), Python sollten nicht bewerten, der zweite term derand
(da es nun nicht seinTrue
) und bewegen sich entlang. Sie würde einfach hinzufügen müssen, um eine weitere else-Klausel (und damit vielleicht machen dieelse
eineelif
) und behandeln Sie es.NB: auf Diese Weise könnte ein bit hacky-je nachdem, was Sie würde tun müssen, um zu bestimmen, ob Sie bereits wissen, die Aussage ist
True
:\Aus, was ich verstehe, Sie versuchen zu speichern, wenn der Vergleich für den Rest der Schleife. Ich glaube, Sie haben das aufsplitten der Schleife haben Sie in zwei Schleifen, eine, die nicht die if-Anweisung und findet die partition zeigen, und dann die zweite, die einfach überspringt den Vergleich. Sie können halten Sie den Strom i an dem Sie arbeiten, auf eine externe variable um die Schleife, und dann weiter von diesem Punkt aus in der zweiten Schleife.