我理解一个人不能“破坏”一个if语句而只能从一个循环,但是,我试图从概念上停止一个if语句在它第一次在for循环中找到“true”之后
# 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])
masterDictionary中有两个键,每个键分别包含27和29个数据点的列表。因此,循环
for i in range(len(diceList)):
对于每个键,将从0 - 26和0 - 28运行i。这很好,但是在评估if语句时的问题是,一旦找到它,随后对于以下所有范围项都将成立。这是打印输出:
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
任何地方都有'X'表示if语句为false,一旦'O'开始,其余语句将始终为true,因为prob容器的大小增加(最多1.0)。
我正在寻找的是一种方法,一旦找到第一个真正的语句,然后写入字典,然后再次继续外部循环,就告诉循环中的if语句停止。
任何帮助表示赞赏!
更新
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
产生
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]}
答案 0 :(得分:11)
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将终止“最近的封闭循环,如果循环有一个,则跳过可选的else子句。”外部循环将继续下一次迭代。因此,您不是“打破if”,而是包含if的循环。在休息之前,您可以将diceList[0:i+1]
到diceList[0:len(diceList)+1]
的所有值设置为true。
答案 1 :(得分:2)
一种方法是在内部代码中引发异常,并在for循环中捕获它并继续循环。
答案 2 :(得分:1)
那么您知道该陈述是True
的条件是什么?我认为它可能是“如果最后一个语句是真的”,但在您的示例输出中,您最终会回到False
?
无论哪种方式,请考虑将此作为某种首要条件添加到您的if:
if (you don't already know it's True) and (the condition you currently evaluate):
<Do calculations>
如果第一部分被评估为False(即你已经知道它是True
),那么Python不应该评估and
的第二项(因为它现在不能是True
1}})并继续前进。你只需要添加另一个else子句(也许可以使else
成为elif
)并在那里处理它。
注意:这种方式可能有点hacky,具体取决于您需要做什么才能确定您是否已经知道该语句是True
:\
答案 3 :(得分:0)
根据我的理解,你试图保存循环其余部分的if比较。我认为你必须将你所拥有的循环分成两个循环,一个用于执行if语句并找到分区点,然后第二个用于简单地跳过比较。您可以将当前正在处理的当前i保留在循环外部的变量上,然后从第二个循环中的该点继续。
答案 4 :(得分:0)
如果您确定要突破if语句代码块,并且仅在“ break”有效的情况下才这样做,则可以将“ break”放在所需的位置,然后将整个if语句放置只需一次迭代即可在循环中阻止。