Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.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_List_Replace_Compression_Range - Fatal编程技术网

Python中处于可变范围内的舍入数

Python中处于可变范围内的舍入数,python,list,replace,compression,range,Python,List,Replace,Compression,Range,我有一个数字输入列表: lst = [3.253, -11.348, 6.576, 2.145, -11.559, 7.733, 5.825] 我在想一种方法,如果列表中的每个数字都在某个范围内,就用一个给定的数字替换它。我想根据输入列表的最小值和最大值以及控制有多少范围的输入编号创建多个范围。 例如,如果我说我想要3个范围在最小值和最大值之间等分 numRanges = 3 lstMin = min(lst) lstMax = max(lst) step = (lstMax - lstMin

我有一个数字输入列表:

lst = [3.253, -11.348, 6.576, 2.145, -11.559, 7.733, 5.825]
我在想一种方法,如果列表中的每个数字都在某个范围内,就用一个给定的数字替换它。我想根据输入列表的最小值和最大值以及控制有多少范围的输入编号创建多个范围。 例如,如果我说我想要3个范围在最小值和最大值之间等分

numRanges = 3
lstMin = min(lst)
lstMax = max(lst)
step = (lstMax - lstMin) / numRanges

range1 = range(lstMin, lstMin + step)
range2 = range(range1 + step)
range3 = range(range2 + step)
现在,有没有办法让numRanges变量驱动范围的数量? 稍后,我将以输入列表为例,例如:

for i in lst:
    if i in range1:
        finalLst.append(1) #1 comes from range1 and will be growing if more ranges
    elif i in range2:
        finalLst.append(2) #2 comes from range2 and will be growing if more ranges
    else i in range3:
        finalLst.append(3) #3 comes from range2 and will be growing if more ranges
在我看来,这一切都是“手动”的,我不知道如何让它更灵活一点,我可以只指定多少范围和一个数字列表,让代码来做其余的事情。提前谢谢你的帮助

finalLst = [3, 1, 3, 3, 1, 3, 3]

Python有一个非常好的工具来完成这类工作,叫做。假设您的范围列表定义如下:

ranges = [-15, -10, -5, 5, 10, 15]
对于输入列表,只需调用对分,如下所示:

lst = [3.253, -11.348, 6.576, 2.145, -11.559, 7.733, 5.825]
results = [ranges[bisect(ranges, element)] for element in lst]
导致

>>>[5, -10, 10, 5, -10, 10, 10]
然后,您可以使用Python2.7中的
ranges=range(start,stop,step)
或Python3.X中的
ranges=list(range(start,stop,step))
将其扩展到任意范围列表

更新

重读你的问题,这可能更接近你想要的(仍然使用对分法):


在列表理解中,使用基本数学运算很容易做到这一点:

numRanges = 3
lstMin = min(lst)
lstMax = max(lst) + 1e-12 # small value added to avoid floating point rounding issues
step = (lstMax - lstMin) / numRanges

range_numbers = [int((x-lstMin) / step) for x in lst]
这将为原始列表中的每个值提供一个整数,
0
表示该值属于第一个范围,
1
为第二个范围,依此类推。它几乎与您的代码相同,但数字从
0
开始,而不是
1
(如果您确实想要1-index,可以在计算中粘贴
+1

我添加到
lstMax
的小值存在有两个原因。第一是确保浮点舍入问题不会使列表中的最大值产生
numRange
作为其范围索引,而不是
numRange-1
(表示
numRange
第个范围)。另一个原因是,如果列表只包含一个值(可能重复多次),从而
min(lst)
max(lst)
返回相同的值,则可以避免被零除的错误

numRanges = 3
lstMin = min(lst)
lstMax = max(lst) + 1e-12 # small value added to avoid floating point rounding issues
step = (lstMax - lstMin) / numRanges

range_numbers = [int((x-lstMin) / step) for x in lst]