如何确定一个数字是否在范围列表中?
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_
,将用列表的每个元素填充。
好吧,我有一个范围列表,例如
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_
,将用列表的每个元素填充。