【问题标题】:How to find the positions that a number falls in-between in a set of sequential integers如何找到一个数字在一组连续整数之间的位置
【发布时间】:2021-03-02 03:21:51
【问题描述】:

我有一个数字变量和一组连续的整数。随着数字变量的变化,我需要记录数字变量在连续整数集中的哪些位置。

例如,如果我的整数集是:

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

只是无法完成它的工作原理,主要是通过获取列表的下一个位置来替换“以下项目”。也许有更好的方法来解决这个问题?任何帮助深表感谢!谢谢!

【问题讨论】:

  • 22.74 不是整数。
  • 如果num 整数呢?例如。如果num == 24,结果应该是什么?
  • 相应地更新了问题。谢谢。
  • 比较你的值是否低于当前元素就足够了,如果条件失败返回当前索引和前一个索引,则中断循环执行。要使用它的索引迭代值,您可以使用enumerate()
  • 是否可以num 停留在li 间隔内?例如num=32

标签: python list for-loop integer


【解决方案1】:

你的基本逻辑很接近。您需要遍历列表。如果您使用索引而不是值来执行此操作,您将能够检索您想要的位置。 你的基本逻辑没问题。

for idx in range(len(li)-1):
    if li[idx] < num < li[idx+1]:
        pos1, pos2 = idx, idx+1

鉴于此,我希望您可以将平等问题作为一个特例来解决,对吧?

【讨论】:

  • 我会避免有条件地分配pos1, pos2。也许创建一个返回Tuple[Optional[int], Optional[int]] 的函数。也可能想考虑0.5, [1,2,3]3.5, [1,2,3]等特殊情况
  • 是的,有许多复杂的方法可以解决这个问题,其中许多方法更强大、更通用。我的目的(在某种程度上也是 Stack Overflow 的目的)是让学生克服当前的障碍。对于一个合适的初学者问题(这里是矛盾的说法),我将技术水平保持在我对课程大纲的猜测范围内。
  • IMO num &gt; max(li)num &lt; min(li) 将是需要考虑的极端情况。至少在循环或 OP 之前设置 pos1, pos2 = None, None 可能会开始得到很多 NameError 引发。
  • 这很有效,可以让我到达我需要的地方。我可以独立解决数字等于列表项的事件。谢谢!
  • @flakes 感谢您发现潜在的障碍。我在代码中的循环上方包含了pos1, pos2 = None, None
【解决方案2】:

我不会触及关于num 是否为整数的歧义。但我会给你回答问题所需的工具。

lohi 分别为您感兴趣的下限和上限。然后,得到这两者之间的数字的索引是这样完成的:

indices = [i for i, x in enumerate(li)
           if lo < x < hi]

请注意,我在那里使用了两次&lt;。如果您希望下限包含在内,请将第一个 &lt; 替换为 &lt;=。同样,如果您希望上限包含在内,请将第二个 &lt; 替换为 &lt;=。或者非常笼统:

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)]

【讨论】:

    【解决方案3】:

    您可以将您的数字与每个元素进行比较,如果当前元素大于您的数字,则中断循环:

    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
    

    【讨论】:

      【解决方案4】:

      这样做的数学方法是从列表中减去数字并检查两个最小绝对值。如果 li 是一个 numpy 数组,您可以在一行中执行此操作:

      li = np.array(li)
      interval = sorted(np.abs(li-num).argsort()[:2])
      

      【讨论】:

        猜你喜欢
        • 2021-07-17
        • 2018-09-10
        • 1970-01-01
        • 1970-01-01
        • 2020-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-11
        相关资源
        最近更新 更多