如何确定一个数字是否在范围列表中?

How to find out if a number is in a list of ranges?

好吧,我有一个范围列表,例如

a = [[167772352, 167772415], [167772160, 167772223], [167772288, 167772351], [167772224, 167772255]]

然后我有一个像

这样的数字
b = 167772241

现在我知道 b 在列表的第 4 项内,但我如何以最佳方式检查 b 在其中?我想过使用 for 循环遍历列表的每个数字,然后在循环中断时插入,但我觉得必须有一些 python 库函数可以处理这个问题?欢迎任何建议!

简单地遍历列表,获取两个值并从这些值创建一个范围并检查是否 b in range(...),也使用 enumerate,从 1 开始,你会得到该数字在列表中的哪个连续范围内。

a = [[167772352, 167772415], [167772160, 167772223], [167772288, 167772351], [167772224, 167772255]]
b = 167772241

for index, (start, end) in enumerate(a, start=1):
    if b in range(start, end + 1):
        print(index)
        break

您还可以使用列表理解:

a = [[167772352, 167772415], [167772160, 167772223], [167772288, 167772351], [167772224, 167772255]]
b = 167772241

index = [b in range(start, end + 1) for start, end in a].index(True) + 1
print(index)

还要注意 range 中使用的 end + 1,这是因为 range 不包括它的最终值,所以添加 1 意味着范围两边都包容。此外,这两种方法都将获得从 1 开始的索引,这就是您通常计算 (1, 2, 3, 4, ...) 的方式,正如您在问题中所述 b 应该在第四个范围(这意味着您从 1 开始计数)

您可以按以下方式使用 map

a = [[167772352, 167772415], [167772160, 167772223], [167772288, 167772351], [167772224, 167772255]]
b = 167772241
c = list(map(lambda a_: b in range(a_[0], a_[1] + 1), a))

输出将是一个布尔值列表,指示 b 是否包含在 a 的每个范围中:

out: [False, False, False, True]

map 有两个参数。第一个是函数(或 lambda),然后它将应用于您作为第二个参数传递的列表的每个元素。 map returns 一个特殊的对象,但是您可以使用 list().

轻松地将其转换为列表

您可以编写一个常规函数来检查 b 是否在范围内,但使用 lambda 允许您在一行中编写表达式。它有一个参数,a_,将用列表的每个元素填充。