Pythonic 方式查找值在范围列表中的位置

标签 python list search range

我有一个起始值和结束值字典列表:

a = [
      {'start': 1, 'end': 3},
      {'start': 5, 'end': 6},
      {'start': 8, 'end': 10}
    ]

保证列表是有序的,并且没有任何重叠。给定一个值,我需要找到它在列表中的位置。如果它在定义的范围之一内,我需要取回该值。否则,我需要按顺序提供下一个“起始”值。例如,给定 b = 2,我将返回值 2,因为它位于第一个范围内。但是,给定值 b = 7 我会返回 8,因为它是从 7 开始的下一个范围的起始值。

我已经编写了一些代码来执行此操作:

def where_in_range(v, val_ranges):
  # Check if v comes before all ranges
  if v < val_ranges[0]['start']:
    return val_ranges[0]['start']

  # Check if v is within one of the ranges
  for r in val_ranges:
    if v >= r['start'] and v <= r['end']:
      return v

  # Check if v is between ranges
  for i in range(0, len(val_ranges)-1):
    if v > val_ranges[i]['end'] and v < val_ranges[i+1]['start']:
      return val_ranges[i+1]['start']

  return None

但它看起来很非Pythonic。我愿意使用轻量级的包,但是像 pandas 这样重的包已经被淘汰了,因为它被嵌入到 django 应用程序中。关于如何使其更加Python化有什么想法吗?

最佳答案

只需单独检查每个范围即可。范围间值和任何范围前值都是自动处理的。

def where_in_range(v, val_ranges):
    for d in val_ranges:
        if v < d['start']:
            return d['start']
        elif v < d['end']:
            return v

关于Pythonic 方式查找值在范围列表中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55013679/

相关文章:

html - 填充在我的 <ul> 上创建了奇怪的黑线

c# - 如何有效地交叉引用 2 个文本文件? |改进我的代码

Java整数ArrayList返回特定范围内的元素

sql-server - 使用 T-SQL 查找子字符串最后一次出现的索引

Python:多次创建一个小列表有多昂贵?

python - 如何在 python 中创建元组的元组?

python - 我的功能没有运行

python - pandas.plot(...) 意外反转 x 轴

java - ArrayList、List 或其他使用 <> 的类型中的 <> 代表什么?

java - 在 CQ5 中搜索多个标签