Python: “rompiendo” de la instrucción if dentro de un bucle for

Entiendo que uno no puede “romper” una instrucción if y solo de un bucle, sin embargo, estoy intentando detener conceptualmente que una instrucción if se evalúe después de que encuentre una “verdadera” la primera vez cuando está dentro de un bucle for.

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

Hay dos claves en el MasterDictionary y cada una contiene una lista de 27 y 29 puntos de datos respectivamente. Por lo tanto, el bucle

 for i in range(len(diceList)): 

ejecutará i de 0 a 26 y de 0 a 28 para cada tecla. Esto es genial, pero el problema cuando se evalúa la sentencia if es que una vez que se encuentra, posteriormente será cierto para todos los siguientes elementos de rango. Aquí está la salida de impresión:

 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 

En cualquier lugar donde haya una ‘X’ significa que la afirmación if era falsa, y una vez que comienza una ‘O’, el rest de las afirmaciones siempre serán verdaderas debido al aumento del tamaño del contenedor prob (hasta 1.0).

Lo que estoy buscando es una manera de decirle a mi instrucción if que se detenga una vez que encuentre la primera statement verdadera, luego escribir en el diccionario y luego continuar el ciclo externo nuevamente.

Cualquier ayuda apreciada!

ACTUALIZAR:

 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 

produce:

 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]} 

  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 

La interrupción terminará "el bucle de cierre más cercano, omitiendo la cláusula else opcional si el bucle tiene uno". El bucle externo simplemente continuará con la siguiente iteración. Por lo tanto, no está "rompiendo el if" sino el bucle que contiene el if. Antes del descanso, puede configurar todos los valores desde la diceList[0:i+1] de diceList[0:i+1] a la diceList[0:len(diceList)+1] de diceList[0:len(diceList)+1] hasta cierto.

Un método es generar una excepción en el código interno, atraparla dentro del bucle for y continuar el bucle.

Entonces, ¿cuáles son las condiciones que usted sabe que la statement es True ? Pensé que podría ser “si la última afirmación fuera Verdadera”, pero en su salida de muestra finalmente regresa a False ?

De cualquier manera, considera agregar esto como una especie de primera condición para tu si:

 if (you don't already know it's True) and (the condition you currently evaluate):  

Si la primera parte se evalúa como Falso (es decir, ya SABES que es True ), Python no debería evaluar el segundo término de and (ya que ahora no puede ser True ) y seguir adelante. Simplemente deberías agregar otra cláusula más (y tal vez hacer que el else un elif ) y manejarlo allí.

NB: Esta forma podría ser un poco intrincada según lo que necesitaría hacer para determinar si ya sabe que la afirmación es True :

Por lo que entiendo, está intentando guardar la comparación if para el rest del bucle. Creo que tienes que dividir el bucle que tienes en dos bucles, uno que hace la instrucción if y encuentra el punto de partición y luego el segundo que simplemente omite la comparación. Puede mantener la stream i en la que está trabajando en una variable externa al bucle y luego continuar desde ese punto en el segundo bucle.