Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何在小于目标的列表中查找值_Python - Fatal编程技术网

Python:如何在小于目标的列表中查找值

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

例如,我有一个非有序的值列表[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])
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 + "&#x00B0; 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)