Python:如何在小于目标的列表中查找值
例如,我有一个非有序的值列表[10、20、50、200、100、300、250、150] 我有一个返回下一个较大值的代码:Python:如何在小于目标的列表中查找值,python,Python,例如,我有一个非有序的值列表[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
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])
e、 g.如果温度=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"
def OnTWMatCurrentIndexChanged(self):
self.ClearTWSelectInputs()
材质=self.cb\u TW\u mat.currentText()
temp=self.txt\u design\u temp.text()
如果是材料!="":
Eref=self.GetMaterialData(材料,“25”,“弹性”)
如果Eref和Eref!="":
Eref=str(浮动(Eref)/100000000)
self.txt_TW_Eref.setText(Eref)
其他:
self.txt_TW_Eref.setText(“194.8”)
self.ShowMsg(“材料数据文件中未找到Eref的温度匹配。将使用194.8 GPa的值。”,“蓝色”)
如果是材料!=“还有临时工!”"":
如果自检温度(材料、温度):
密度=自身获取材料数据(材料、温度、“密度”)
self.txt_TW_dens.setText(dens)
elast=自身获取材料数据(材料、温度,“elast”)
elast=str(浮动(elast)/100000000)
self.txt_TW_Et.setText(elast)
应力=自身获取材料数据(材料、温度、“应力”)
应力=str(浮动(应力)/1000000)
self.txt\u TW\u stress\u limit.setText(应力)
其他:
self.ShowMsg(“在材料数据文件中未找到“+temp+”和#x00B0;C”的温度匹配。将尽可能使用外推数据或添加新材料数据。”,“蓝色”)
密度=自身。获取外推材料数据(材料、温度,“密度”)
self.txt_TW_dens.setText(dens)
elast=自身。获取外推材料数据(材料、温度,“elast”)
elast=str(浮动(elast)/100000000)
self.txt_TW_Et.setText(elast)
应力=自身。获取外推材料数据(材料、温度、“应力”)
应力=str(浮动(应力)/1000000)
self.txt\u TW\u stress\u limit.setText(应力)
其他:
self.ClearTWSelectInputs()
def CheckTWTemp(自身、matvar、tempvar):
对于self.materials中的材质:
如果material.attrib[“name”]==matvar:
temps=material.getiterator(“temp”)
对于temp中的temp:
如果int(临时文本)=int(临时变量):
返回真值
返回错误
def GetMaterialData(self、matvar、tempvar、tag):
对于self.materials中的材质:
如果material.attrib[“name”]==matvar:
temps=material.getiterator(“temp”)
对于temp中的temp:
如果temp.text==tempvar:
值=临时查找(标记)
返回值.text
def GetExterpolatedMaterialData(自身、matvar、tempvar、标记):
尝试:
圣堂武士=QStringList()
对于self.materials中的材质:
如果material.attrib[“name”]==matvar:
temps=material.getiterator(“temp”)
对于temp中的temp:
templist.append(临时文本)
圣殿骑士
目标=int(tempvar)
x1=最大值(如果t!=''且int(t)target,则模板列表中t的int(t)值)
y1=float(self.GetMaterialData(matvar,str(x1),tag))
y2=浮点(self.GetMaterialData(matvar,str(x2),tag))
x=目标
y=y1-((y1-y2)*(x-x1)/(x2-x1))
返回str(y)
除例外情况外,说明:
返回“0”
编辑:啊,我用了圣殿骑士
,而不是列表
——因此产生了混乱。我并不是说它是一个单行函数;你仍然需要做转换。(当然,正如Mike DeSimone正确指出的,使用list作为变量名是一个糟糕的想法!!所以我有一个很好的理由感到困惑。:)
为了更明确地说明这一点,这里有一个稍微简化的函数版本(修复为正确测试空列表):
如果我对你的理解是正确的,你想要的最大价值是低于你的目标;e、 在你的例子中,如果你的目标是55,你想要50,但是如果你的目标是35,你想要20。以下功能应能做到这一点:
def get_closest_less(lst, target):
lst.sort()
ret_val = None
previous = lst[0]
if (previous <= target):
for ndx in xrange(1, len(lst) - 1):
if lst[ndx] > target:
ret_val = previous
break
else:
previous = lst[ndx]
return str(ret_val)
def获取最近距离(lst,目标):
lst.sort()
ret_val=无
上一个=lst[0]
如果(以前的目标:
ret_val=上一个
打破
其他:
上一个=lst[ndx]
返回str(返回值)
如果需要逐步查看这些值,可以使用a连续获取这些值:
def next_lesser(l, target):
for n in l:
if n < target:
yield str(n)
def next_less(l,目标):
对于l中的n:
如果n<目标:
产量str(n)
这两种方法在一个简单的程序中都能正常工作。一种更好、更快(代码和cpu方面)的方法是使用二分法模块,该模块进行二进制搜索,但为此,您需要首先对列表进行排序,以下是示例用法:
import bisect
mylist = [10, 20, 50, 200, 100, 300, 250, 150]
mylist.sort()
index = bisect.bisect(mylist, 55)
print "Greater than target", mylist[index]
print "Smaller than or equal to target", mylist[index-1]
输出:
Greater than target 100
Smaller than or equal to target 50
您还需要检查返回的索引,如果它是
0
,则表示您通过的目标低于最低的让无序列表成为myList
:
nextHighest = lambda seq,x: min([(i-x,i) for i in seq if x<=i] or [(0,None)])[1]
nextLowest = lambda seq,x: min([(x-i,i) for i in seq if x>=i] or [(0,None)])[1]
答案=最大值(如果x<温度,则在myList中x代表x)
senderle,非常感谢,它很有效!要获得原始的最大值,是否还有一个较短的形式来代替我的10行?哦,我知道了,它只是返回str(min(如果t>target,则templast中t代表t))目标被转换为int,这不是问题所在。我认为这与我传递的list参数有关。当我用字符串值声明list变量时(为了模拟list)这一切都是可行的,但它不适用于实际传递的列表参数。@Mike DeSimone,我认为这行可以替代OP文章中的返回行,返回行已经进行了必要的转换。@senderle好吧,这两行都可以在
Greater than target 100
Smaller than or equal to target 50
nextHighest = lambda seq,x: min([(i-x,i) for i in seq if x<=i] or [(0,None)])[1]
nextLowest = lambda seq,x: min([(x-i,i) for i in seq if x>=i] or [(0,None)])[1]
>>> t = [10, 20, 50, 200, 100, 300, 250, 150]
>>> print nextHighest(t,55)
100
>>> print nextLowest(t,55)
50
>>> print nextHighest([],55)
None
>>> print nextLowest([],55)
None
>>> print nextHighest(t,550)
None
a=[4,3,8,2,5]
temp=4
def getSmaller(temp,alist):
alist.sort()
for i in range(len(alist)):
if(i>0 and alist[i]==temp):
print alist[i-1]
elif(i==0 and alist[i]==temp):
print alist[i]
getSmaller(temp,a)