Python: "pulling out" an if statement inside a for loop

I understand that it is impossible to โ€œbreakโ€ the if statement and only from the loop, however, I try to conceptually stop the if statement from the evaluation after it finds the โ€œtrueโ€ the first time it is inside the for loop.

# 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]) 

There are two keys in masterDictionary, each of which contains a list of 27 and 29 data points, respectively. Therefore loop

 for i in range(len(diceList)): 

I will run from 0 to 26 and 0-28 for each key. This is great, but the problem when calculating the if statement is that once it is found, it will subsequently be true for all of the following elements in the range. Here is the printout:

 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 

Anywhere, โ€œXโ€ means that the if statement was false, and as soon as โ€œOโ€ starts, the rest of the statements will always be true due to the increase in the size of the prob container (to 1.0).

What I'm looking for is a way of saying that the if statement inside the loop stops when it finds the first true statement, then writes to the dictionary, and then continues the outer loop again.

Any help appreciated!

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 

gives:

 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]} 
+7
source share
4 answers
  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]) break 

Break will interrupt "the closest closed loop by skipping the optional else clause if it has one." The outer loop will continue with the next iteration. Thus, you do not "break if", but include an if loop. Before the break, you can simply set all values โ€‹โ€‹from diceList[0:i+1] to diceList[0:len(diceList)+1] to true.

+11
source

One method is to raise an exception in the internal code and catch it inside the for loop and continue the loop.

+2
source

So what are the conditions that you know is True ? I thought it could be "if the last statement was True, but in your output example, do you end up returning to False ?

In any case, consider adding this as a kind of first condition to your if:

 if (you don't already know it True) and (the condition you currently evaluate): <Do calculations> 

If the first part evaluates to False (i.e. you already know its True ), Python should not evaluate the second member and (since now it cannot be True ) and moves along. You just need to add another else clause (and possibly make else a elif ) and process it there.

NB: this method may be a little hacked depending on what you will need to do to determine if you know that the True statement: \

+1
source

From what I understand, you are trying to keep the if comparison for the rest of the loop. I think you need to break the loop that you have into two loops, one of which executes the if statement, and finds the section point, and then the second, which just skips the comparison. You can save the current i you are working on to a variable external to the cycle, and then continue from this point in the second cycle.

0
source

All Articles