【问题标题】:Find index of list entries where value is in between查找值介于两者之间的列表条目的索引
【发布时间】:2015-08-27 21:41:17
【问题描述】:

很难找到这个问题的标题,所以让我描述一下这个问题。我有一个严格单调递增的浮点值列表,其中 0 和 1 分别是上限和下限。还有一个值,我想知道实际值在哪两个值之间。

考虑以下示例:

li = [0, 0.1, 0.2, 0.3, 0.5, 0.75, 0.9, 1.0]

我需要一个基本上返回匹配对索引的函数。如果值在 0 和 0.1 之间(准确地说:0

get_index(li, 0.3) = 3
get_index(li, 0.05) = 0
get_index(li, 0.9) = 6

我目前的方法是遍历列表,存储最后一项和当前项并使用计数器。基本上是这样的:

def get_index(li, val):
    counter = 0
    old_val = None
    new_val = None
    for item in li:
        if new_val is None:
            new_val = item
                continue
            old_val = new_val
            new_val = item
            if old_val <= val and val < new_val:
                return counter
        counter += 1

我觉得必须有一个更简单的方法。如何更短、更轻松地做到这一点?

【问题讨论】:

  • 为什么 get_index(li, 0.9) 会是 7 ?你的意思是6?
  • @Kasramvd:不,7 是正确的,因为 0.9
  • “匹配对”到底是什么意思?
  • @Kasramvd:对不起,算了。晚了……当然,应该是 6 点。

标签: python list


【解决方案1】:

你想要bisect:

>>> bisect.bisect_right(li, 0.3) - 1
3
>>> bisect.bisect_right(li, 0.05) - 1
0
>>> bisect.bisect_right(li, 0.9) - 1
6

【讨论】:

    【解决方案2】:

    试试这个,但get_index(li, 0.9) 将是6

    def get_index(l, v):
        if 0<=v<=.1:
            return 0
        return l.index(v)
    
    >>>get_index(li, 0.3)
    3
    

    【讨论】:

      【解决方案3】:

      这应该可以解决问题..

        def get_index(li, val):
              return li.index(max( i for i in li if  val >= i ))
      

      【讨论】:

        【解决方案4】:

        如果您的列表总是严格单调的,那么一个简单易读的代码可能如下(即使比以前的答案更不pythonic):

        def get_index(li, val):
            for index in range(len(li)-1):
                if (li[index] <= val < li[index+1]):
                    return index
            return len(li)   # in case of val is greater than max value of the list
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多