python - 如何查找列表中的数字是否在列表中两个数字的区间内?
问题描述
我有两个相同长度的排序列表,例如:
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
获取列表的两个视图并为每对生成一个元组,然后将其分配给低和高。
low <= val <= high
在 C、C++ 或 C# 中是一个逻辑错误,但在 python 中是完全正确的。它被定义为“low <= val and val <= high”,这正是您在这种情况下要寻找的。
使用 str.format 是一种在 python 中输出所有类型变量的简单方法。
推荐阅读
- r - 删除多个数据框中负值后的行
- python-2.7 - AttributeError:使用 Pyinstaller 时,“str”对象没有属性“items”
- elixir - 未使用的宏,编译器警告
- android - 网格视图的分隔线颜色
- swift - 文件管理器内存泄漏
- android-studio - 如何在 IntelliJ IDEA / Android Studio 中添加自定义 Kotlin 后缀补全?
- docker - Docker for Windows - 挂载目录为空
- javascript - 反应路由器和道具
- kubernetes - 用于更新现有服务资源的 Kubectl apply 命令
- java - JAVA:扫描特定网络以获取主机名