例如,我有一个非有序的值列表[10,20,50,200,100,300,250,150]
我有一个返回下一个较大值的代码:
def GetNextHighTemp(self, temp, templist):
target = int(temp)
list = []
for t in templist:
if t != "":
list.append(int(t))
return str(min((abs(target - i), i) for i in list)[1])
例如,如果温度=55,则返回“100”。
但我怎样才能得到价值中的较小者呢?这就是如何让它返回“50”?
谢谢你。
编辑-正在工作
def OnTWMatCurrentIndexChanged(self):
self.ClearTWSelectInputs()
material = self.cb_TW_mat.currentText()
temp = self.txt_design_temp.text()
if material != "":
Eref = self.GetMaterialData(material, "25", "elast")
if Eref and Eref != "":
Eref = str(float(Eref) / 1000000000)
self.txt_TW_Eref.setText(Eref)
else:
self.txt_TW_Eref.setText("194.8")
self.ShowMsg("No temperature match found for E<sub>ref</sub> in material data file. Value of 194.8 GPa will be used.", "blue")
if material != "" and temp != "":
if self.CheckTWTemp(material, temp):
dens = self.GetMaterialData(material, temp, "dens")
self.txt_TW_dens.setText(dens)
elast = self.GetMaterialData(material, temp, "elast")
elast = str(float(elast) / 1000000000)
self.txt_TW_Et.setText(elast)
stress = self.GetMaterialData(material, temp, "stress")
stress = str(float(stress) / 1000000)
self.txt_TW_stress_limit.setText(stress)
else:
self.ShowMsg("No temperature match found for " + temp + "° C in material data file. Extrapolated data will be used where possible or add new material data.", "blue")
dens = self.GetExtrapolatedMaterialData(material, temp, "dens")
self.txt_TW_dens.setText(dens)
elast = self.GetExtrapolatedMaterialData(material, temp, "elast")
elast = str(float(elast) / 1000000000)
self.txt_TW_Et.setText(elast)
stress = self.GetExtrapolatedMaterialData(material, temp, "stress")
stress = str(float(stress) / 1000000)
self.txt_TW_stress_limit.setText(stress)
else:
self.ClearTWSelectInputs()
def CheckTWTemp(self, matvar, tempvar):
for material in self.materials:
if material.attrib["name"] == matvar:
temps = material.getiterator("temp")
for temp in temps:
if int(temp.text) == int(tempvar):
return True
return False
def GetMaterialData(self, matvar, tempvar, tag):
for material in self.materials:
if material.attrib["name"] == matvar:
temps = material.getiterator("temp")
for temp in temps:
if temp.text == tempvar:
value = temp.find(tag)
return value.text
def GetExtrapolatedMaterialData(self, matvar, tempvar, tag):
try:
templist = QStringList()
for material in self.materials:
if material.attrib["name"] == matvar:
temps = material.getiterator("temp")
for temp in temps:
templist.append(temp.text)
templist.sort()
target = int(tempvar)
x1 = max(int(t) for t in templist if t != '' and int(t) < target)
x2 = min(int(t) for t in templist if t != '' and int(t) > target)
y1 = float(self.GetMaterialData(matvar, str(x1), tag))
y2 = float(self.GetMaterialData(matvar, str(x2), tag))
x = target
y = y1 - ((y1 - y2) * (x - x1) / (x2 - x1))
return str(y)
except Exception, inst:
return "0"
这是如何工作的:看看
nextHighest
,min的参数是一个列表理解,它计算列表中的每个值和输入x之间的差异,但仅限于那些值>;=x。因为您需要实际值,所以我们需要列表元素包括值的差异和实际值。元组是按值从左到右进行比较的,因此序列中每个值的元组都变成了i
-最小元组将在第[1]
个元素中具有实际值。如果输入的x值超出seq中的值范围(或者seq只是空的),那么列表理解将给我们一个空列表,这将在
min
中引发一个值错误。如果发生这种情况,我们将参数中的or [(0,None)]
项添加到min
。如果列表理解为空,那么它的值将为False,在这种情况下,min将查看包含单个元组(0,None)
的序列。在本例中,第[1]
个元素为None,表明seq中没有高于x的元素下面是一些测试用例:
一个更好更快的方法(代码和cpu方面)是使用bisect模块,该模块执行二进制搜索,但是您需要首先对列表进行排序,下面是示例用法:
输出:
此外,您还需要检查返回的索引,如果它是
0
,则表示您通过的目标低于最低的编辑:啊,我用的是
templist
,而不是list
——因此产生了混淆。我不是说它是一个单行函数,你仍然需要进行转换。(当然,正如Mike DeSimone正确指出的那样,使用list作为变量名是一个糟糕的主意!!所以我有充分的理由感到困惑。:)为了更明确地说明这一点,这里有一个稍微简化的函数版本(修复为正确测试空列表):
感谢Mike的建议,在空列表的情况下返回
None
——我喜欢这样。你可以把这个缩短得更像这样:
相关问题 更多 >
编程相关推荐