我有一个数字变量和一组连续的整数。随着数字变量的变化,我需要记录数字变量在整数序列集中的位置。
例如,如果我的整数集是:
li = [20,21,22,23,24,25,26,27,28,29,30]
数字变量是:
num = 22.74
我想要的输出是列表中num
介于以下位置之间的位置:
2,3
我知道li.index(22)
会返回该位置,但前提是该项目在列表中。如果数字介于两个项目之间,我还不知道如何找到位置。
我想象一个for循环,通过检查num
是否在这两个整数之间,将num
与列表中的每个相邻位置项进行比较,可以解决这个问题
for x and the following item in li:
if x < num < the following item:
positionone = x
positiontwo = the following item
else:
continue
只是还没能完成这项工作,主要是通过获得列表的下一个位置来代替">下面的项目";。也许有更好的方法来计算这个?非常感谢您的帮助!谢谢
您已接近基本逻辑。您需要遍历列表。如果你使用索引而不是值,你将能够检索到你想要的位置。你的基本逻辑很好。
for idx in range(len(li)-1):
if li[idx] < num < li[idx+1]:
pos1, pos2 = idx, idx+1
既然如此,我希望你能把平等问题作为一个特例来解决,对吧?
我不会触及关于num
是否为整数的模糊性。但我会给你答案所需的工具。
设lo
和hi
分别为您感兴趣的下限和上限。然后,要得到这两者之间的数字的索引,可以这样做:
indices = [i for i, x in enumerate(li)
if lo < x < hi]
请注意,我在那里用了两次<
。如果希望下界包含,请将第一个<
替换为<=
。类似地,如果您希望上界是包含的,请将第二个<
替换为<=
。或者非常普遍:
def indices_between(iterable, lo, hi, include_lo=False, include_hi=False):
lo_req = (lambda x: lo <= x) if include_lo else (lambda x: lo < x)
hi_req = (lambda x: x <= hi) if include_hi else (lambda x: x < hi)
return [i for i, x in enumerate(iterable)
if lo_req(x) and hi_req(x)]
您可以将您的数字与每个元素进行比较,如果当前元素大于您的数字,则中断循环:
for index, current_element in enumerate(li):
if current_element > num:
position_one, position_two = index - 1 if index else index, index
break
else:
position_one, position_two = index, index
一种数学方法是从列表中减去数字,并检查两个最小绝对值。如果li
是一个numpy数组,您可以在一行中完成:
li = np.array(li)
interval = sorted(np.abs(li-num).argsort()[:2])