![](/img/trans.png)
[英]For a list of numbers and a list of intervals, find the interval in which each number is located
[英]How to find if a number in a list is in a interval of two numbers in a list?
我有两个相同长度的排序列表,例如:
first_list = [3, 5, 15, 19, 23]
second_list = [0, 11, 22, 34, 43]
我想知道第一个列表的编号是否在第二个列表的一行中由两个数字组成的区间中。 然后,我希望打印第一个列表的值和间隔。
举个例子:
3 in range(0,11) # True
5 in range(0,11) # True
15 in range(0,11) # False, next
15 in range(11,22) # True
等等。
first_list = [3, 5, 15, 19, 23]
second_list = [0, 11, 22, 34, 43]
aux = 0
count = 1
n_iterations = len(first_list)
iteration = 0
while iteration != n_iterations:
iteration += 1
for i in first_list:
counter = first_list.index(i)
try:
interval = range(second_list[aux],second_list[count])
if i in interval:
print(i, 'in', interval)
if i not in interval:
aux += 1
count += 1
interval = range(second_list[aux], second_list[count])
if i in interval:
print(i, 'in' ,interval)
except IndexError:
break
我试过的代码确实有效。 但它似乎效率低下且“难以阅读”,必须采用另一种方式来实现。
编辑:由于问题已更新,我稍微更新了我的答案。 我很高兴地承认这个解决方案不是最优的,并且比用户7440787的解决方案花费更多的时间。 我更关注问题的“难以阅读”而非“低效”部分。
首先,我的答案,然后一些解释。
first_list = [3, 5, 15, 19, 23]
second_list = [0, 11, 22, 34, 43]
for low,high in zip(second_list, second_list[1:]):
for val in first_list:
if low <= val <= high:
print("{} is in {}".format(val, (low, high)))
输出:
3 is in (0, 11)
5 is in (0, 11)
15 is in (11, 22)
19 is in (11, 22)
23 is in (22, 34)
这为您提供简单优雅,同时仍然可读。 将所有内容都放在一行上总是一个有趣的挑战,但是当您将代码分解为重要部分时,代码更容易处理。 当然,还有其他方法可以做到这一点,但这显示了很多python的细节。
zip(second_list, second_list[1:])
遍历second_list中的对列表。 [1:]
将列表分割为除了它的第一个元素以外的所有元素,而zip
获取列表的两个视图并为每对产生一个元组,然后将其分配给低和高。
low <= val <= high
是C,C ++或C#中的逻辑错误,但在python中完全正确。 它被定义为“low <= val和val <= high”,这正是你在这种情况下所寻找的。
使用str.format是在python中输出所有类型变量的简单方法。
如果要在第一次打印条目不在列表中时,则需要:
first_list = [3, 5, 15, 19, 23]
second_list = [0, 11, 22, 34, 43]
regions = list(zip(second_list[:-1],second_list[1:]))
n, i = 0, 0
print_stm = '%i %s in range(%i,%i)'
while n < len(regions) and i < len(first_list):
if regions[n][0] <= first_list[i] <= regions[n][1]:
print(print_stm % ((first_list[i], '') + regions[n]))
i+=1
else:
print(print_stm % ((first_list[i], 'not') + regions[n]))
n+=1
结果是:
3 in range(0,11)
5 in range(0,11)
15 not in range(0,11)
15 in range(11,22)
19 in range(11,22)
23 not in range(11,22)
23 in range(22,34)
如果您只想知道first_list
每个条目的间隔,可以将其简化为:
first_list = [3, 5, 15, 19, 23]
second_list = [0, 11, 22, 34, 43]
regions = zip(second_list[:-1],second_list[1:])
intervals = [ (i, n) for i in first_list for n in regions if n[0] < i < n[1]]
结果是:
[(3, (0, 11)), (5, (0, 11)), (15, (11, 22)), (19, (11, 22)), (23, (22, 34))]
针对由第二个列表定义的所有可能的范围对的一行解决方案。
你的代码似乎很好,但这是一个较短的版本:
# define all duo pairs based on `second_list`
all_pairs = [[second_list[p1], second_list[p2]] for p1 in range(len(second_list)) for p2 in range(p1+1,len(second_list))]
results = list()
results.append([[element,"is in", (all_pairs[i][0],all_pairs[i][1])] for element in first_list for i in range(len(all_pairs)) if element in range(all_pairs[i][0],all_pairs[i][1])])
如果我理解正确,上述应该有效。
输出:
[[[3, 'is in', (0, 11)],
[3, 'is in', (0, 22)],
[3, 'is in', (0, 34)],
[3, 'is in', (0, 43)],
[5, 'is in', (0, 11)],
[5, 'is in', (0, 22)],
[5, 'is in', (0, 34)],
[5, 'is in', (0, 43)],
[15, 'is in', (0, 22)],
[15, 'is in', (0, 34)],
[15, 'is in', (0, 43)],
[15, 'is in', (11, 22)],
[15, 'is in', (11, 34)],
[15, 'is in', (11, 43)],
[19, 'is in', (0, 22)],
[19, 'is in', (0, 34)],
[19, 'is in', (0, 43)],
[19, 'is in', (11, 22)],
[19, 'is in', (11, 34)],
[19, 'is in', (11, 43)],
[23, 'is in', (0, 34)],
[23, 'is in', (0, 43)],
[23, 'is in', (11, 34)],
[23, 'is in', (11, 43)],
[23, 'is in', (22, 34)],
[23, 'is in', (22, 43)]]]
这就是我所做的:
first_list = [3, 5, 15, 19, 23]
second_list = [0, 11, 22, 34, 43]
L = list(zip(second_list[:-1], second_list[1:]))
i = 0
n = 0
interval = L[i]
while n < len(first_list):
nb = first_list[n]
while nb not in range(interval[0],interval[1]):
print(nb, ' is not in range', interval)
i += 1
if i >= len(L):
break
interval = L[i]
if i >= len(L):
break
print(nb, ' is in range', interval)
n += 1
输出 :
3 is in range(0, 11)
5 is in range(0, 11)
15 is not in range(0, 11)
15 is in range(11, 22)
19 is in range(11, 22)
23 is not in range(11, 22)
23 is in range(22, 34)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.