我有两个相同长度的排序列表,例如:
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
我试过的代码确实有效。但它似乎效率低下且“难以阅读”,所以必须有另一种方法来做到这一点。
最佳答案
编辑:由于问题已更新,我稍微更新了我的答案。我高兴地承认这个解决方案不是最优的,并且比 user7440787 的解决方案花费更多的时间。我更关注问题的“难以阅读”部分而不是“低效”部分。
首先是我的回答,然后是一些解释。
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
获取列表的两个 View 并为每一对生成一个元组,然后将其分配给低和高。
low <= val <= high
在 C、C++ 或 C# 中是逻辑错误,但在 Python 中是完全正确的。它被定义为“low <= val and val <= high”,这正是您在这种情况下要查找的内容。
使用 str.format 是一种在 python 中输出所有类型变量的简单方法。
关于python - 如何查找列表中的数字是否在列表中两个数字的区间内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57383420/