Python 中两个范围列表的交集

2023-11-22

我的一个朋友向我传递了他最近收到的一个面试问题,我对我的解决方案不太满意。问题如下:

  • 你有两个清单。
  • 每个列表将包含长度为 2 的列表,表示一个范围(即 [3,5] 表示从 3 到 5(含)的范围)。
  • 您需要返回集合之间所有范围的交集。如果我给你 [1,5] 和 [0,2],结果将是 [1,2]。
  • 在每个列表中,范围将始终增加并且从不重叠(即,它将是 [[0, 2], [5, 10] ... ] 而不是 [[0,2], [2,5] ... ] )

一般来说,列表的排序或重叠方面不存在“陷阱”。

Example:

a = [[0, 2], [5, 10], [13, 23], [24, 25]]
b = [[1, 5], [8, 12], [15, 18], [20, 24]]

预期输出:[[1, 2], [5, 5], [8, 10], [15, 18], [20, 24]]

我的懒惰解决方案涉及将范围列表扩展为整数列表,然后进行集合交集,如下所示:

def get_intersection(x, y):
    x_spread = [item for sublist in [list(range(l[0],l[1]+1)) for l in x] for item in sublist]
    y_spread = [item for sublist in [list(range(l[0],l[1]+1)) for l in y] for item in sublist]
    flat_intersect_list = list(set(x_spread).intersection(y_spread))
...

但我想有一个既可读又更高效的解决方案。

如果您不介意的话,请解释一下您将如何在精神上解决这个问题。时间/空间复杂性分析也会有所帮助。

Thanks


[[max(first[0], second[0]), min(first[1], second[1])] 
  for first in a for second in b 
  if max(first[0], second[0]) <= min(first[1], second[1])]

给出答案的列表理解:[[1, 2], [5, 5], [8, 10], [15, 18], [20, 23], [24, 24]]

分解一下:

[[max(first[0], second[0]), min(first[1], second[1])] 

第一项的最大值,第二项的最小值

for first in a for second in b 

对于第一项和第二项的所有组合:

if max(first[0], second[0]) <= min(first[1], second[1])]

仅当第一个的最大值不超过第二个的最小值时。


如果您需要压缩输出,那么以下函数可以做到这一点(在O(n^2)时间,因为从列表中删除是O(n),我们执行的一个步骤O(n) times):

def reverse_compact(lst):
    for index in range(len(lst) - 2,-1,-1):
        if lst[index][1] + 1 >= lst[index + 1][0]:
            lst[index][1] = lst[index + 1][1]
            del lst[index + 1]  # remove compacted entry O(n)*
    return lst

它连接接触的范围,因为它们是in-order。它以相反的方式进行,因为这样我们就可以执行此操作in place并删除压缩的条目。如果我们不反过来做,删除其他条目就会破坏我们的索引。

>>> reverse_compact(comp)
[[1, 2], [5, 5], [8, 10], [15, 18], [20, 24]]
  • 压缩函数可以进一步简化为O(n)通过进行前向就地压缩并复制回元素,因为每个内部步骤都是O(1)(get/set 而不是 del),但这可读性较差:

这运行在O(n)时间和空间复杂度:

def compact(lst):
    next_index = 0  # Keeps track of the last used index in our result
    for index in range(len(lst) - 1):
        if lst[next_index][1] + 1 >= lst[index + 1][0]:
            lst[next_index][1] = lst[index + 1][1]
        else:    
            next_index += 1
            lst[next_index] = lst[index + 1]
    return lst[:next_index + 1]

使用任一压缩器,列表理解是这里的主导术语,时间 =O(n*m), 空间 =O(m+n),因为它比较两个列表的所有可能组合,没有早期出局。这确实not利用提示中给出的列表的有序结构:您可以利用该结构将时间复杂度降低到O(n + m)因为它们总是增加并且从不重叠,这意味着您可以一次完成所有比较。


请注意,解决方案不止一种,希望您能够解决问题,然后迭代改进它。

满足所有可能输入的 100% 正确答案并不是面试问题的目标。就是看一个人如何思考和应对挑战,以及是否能够推理出解决方案。

事实上,如果你给我一个 100% 正确的教科书答案,那可能是因为你以前见过这个问题并且你已经知道解决方案......因此这个问题对我作为面试官没有帮助。“检查一下,可以反省在 StackOverflow 上找到的解决方案。”这个想法是看着你解决问题,而不是重复解决方案。

太多的候选人只见树木,不见森林:承认缺点并提出解决方案是回答面试问题的正确方法。你不必有解决方案,你必须展示你将如何解决问题。

如果可以的话你的解决方案很好解释一下并详细说明使用它的潜在问题。

我通过未能回答面试问题获得了现在的工作:在花费了大部分时间尝试之后,我解释了为什么我的方法不起作用,以及如果有更多时间我会尝试第二种方法,以及我在其中看到的潜在陷阱方法(以及为什么我最初选择第一个策略)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中两个范围列表的交集 的相关文章

  • 导入错误:无法导入名称“FFProbe”

    我无法获取ffprobe包 https github com simonh10 ffprobe在 Python 3 6 中工作 我使用 pip 安装它 但是当我输入import ffprobe it says Traceback most
  • 从 torch.autograd.gradcheck 导入 zero_gradients

    我想复制代码here https github com LTS4 DeepFool blob master Python deepfool py 并且我在 Google Colab 中运行时收到以下错误 ImportError 无法导入名称
  • GUI 测试工具 PyUseCase 与 Dogtail 相比如何?

    GUI测试工具如何Py用例 http pypi python org pypi PyUseCase重命名为故事文本 http pypi python org pypi StoryText 相比于Dogtail http en wikiped
  • App Engine 上的 Django 与 webapp2 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何同时运行多个功能[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有以下代码 my func1 my func2 my func3 my func4 my func5 是否可以同时计算函数的数据 而
  • 从内存地址创建python对象(使用gi.repository)

    有时我需要调用仅存在于 C 中的 gtk gobject 函数 但返回一个具有 python 包装器的对象 之前我使用过基于 ctypes 的解决方案 效果很好 现在我从 PyGtk import gtk 切换到 GObject intro
  • 如何在 Pandas Python 中按 id 对行进行排名

    我有一个像这样的数据框 id points1 points2 1 44 53 1 76 34 1 63 66 2 23 34 2 44 56 我想要这样的输出 id points1 points2 points1 rank points2
  • 如何通过 python 中的函数运行列表?

    我试图通过我创建的函数运行我的列表 但不断收到错误 我不知道出了什么问题 温度 F temp f 19 21 21 21 23 功能 def fahrToCelsius tempFahrenheit return tempFahrenhei
  • Python 不考虑 distutils.cfg

    我已经尝试了给出的所有内容 并且所有教程都指向相同的方向 即使用 mingw 作为 python 而不是 Visual C 中的编译器 我确实有 Visual C 和 mingw 当我想使用 pip 安装时 问题开始出现 它总是给Unabl
  • Python3将模块从文件夹导入到另一个文件夹

    我的结构字典是 mainFolder folder1 init py file1 py file2 py folder2 init py file3 py file4 py setup py init py 我需要将 file4 py 从f
  • 使用 Pandas 从 csv 文件读取标题信息

    我有一个包含 14 行标题的数据文件 在标头中 有经纬度坐标和时间的元数据 我目前正在使用 pandas read csv filename delimiter header 14 读取文件 但这只是获取数据 我似乎无法获取元数据 有人知道
  • 会话数据库表清理

    该表是否需要清除或者由 Django 自动处理 Django 不提供自动清除功能 然而 有一个方便的命令可以帮助您手动完成此操作 Django 文档 清除会话存储 https docs djangoproject com en dev to
  • 如何从 python 脚本执行 7zip 命令

    我试图了解如何使用 os system 模块来执行 7zip 命令 现在我不想用 Popen 或 subprocess 让事情变得复杂 我已经安装了 7zip 并将 7zip exe 复制到我的用户文件夹中 我只想提取我的测试文件 inst
  • pandas groupby 操作缺少数据

    在 pandas 数据框中 我有一列如下所示 0 M 1 E 2 L 3 M 1 4 M 2 5 M 3 6 E 1 7 E 2 8 E 3 9 E 4 10 L 1 11 L 2 12 M 1 a 13 M 1 b 14 M 1 c 15
  • Eclipse/PyDev 中未使用导入警告,尽管已使用

    我正在我的文件中导入一个绘图包 如下所示 import matplotlib pyplot as plt 稍后我会在我的代码中成功使用此导入 fig plt figure figsize 16 10 然而 Eclipse 告诉我 未使用的导
  • AttributeError: 'super' 对象没有属性 '__getattr__' 在 Kivy 中使用带有多个 kv 文件的 BoxLayout 时出错

    我很清楚 这个问题已经被问过好几次了 但尝试以下解决方案后 Python Kivy AttributeError 尝试获取 self ids 时 super 对象没有属性 getattr https stackoverflow com qu
  • 如何创建增量加载网页

    我正在编写一个处理大量数据的页面 它会永远持续到我的结果页面加载 几乎无限 因为返回的数据太大了 因此 我需要实现一个增量加载页面 例如 url 中的页面 http docs python org http docs python org
  • 从给定的项目列表创建子列表

    我首先要说的是以下问题不是为了家庭作业目的即使因为我几个月前就完成了软件工程师的工作 无论如何 今天我正在工作 一位朋友向我询问了这个奇怪的排序问题 我有一个包含 1000 行的列表 每行代表一个数字 我想创建 10 个子列表 每个子列表都
  • py2exe ImportError:没有名为 的模块

    我已经实现了一个名为 myUtils 的包 它由文件夹 myUtils 文件 组成 init py 和许多名称为 myUtils 的 py 文件 该包包含在 myOtherProject py 中 当我从 Eclipse 运行它们时可以找到
  • 使用 python 将 CSV 文件上传到 Microsoft Azure 存储帐户

    我正在尝试上传一个 csv使用 python 将文件写入 Microsoft Azure 存储帐户 我已经发现C sharp https blogs msdn microsoft com jmstall 2012 08 03 convert

随机推荐

  • preg_match:仅数字字母和逗号

    如何编写仅匹配数字字母和逗号的正则表达式 我想出了下面这个 但它不起作用 它也接受其他标点符号 check for matches number alphabets and commas only if preg match a zA Z0
  • 由于环境变量(HP笔记本电脑),delphi XE2无法在我的计算机上编译任何项目

    我有一台 HP 笔记本电脑 并且在 HP 笔记本电脑上安装了 delphi xe2 过去 5 个月前我使用 delphi 没有任何问题 但现在我收到此错误消息 DCC Error E1026 File not found FMX Filte
  • 订阅中的 Angular 订阅

    我有以下由多个订阅组成的代码 我需要实现的目标是这样的 订阅activatedRoute以获取用户和产品数据 返回商品数据后 使用商品数据订阅getSeller服务 使用返回的卖家数据订阅 getRating 服务 我的问题 有没有更好的方
  • Lua 5.2 中的沙箱

    我正在学习Roberto Ierusalimschy的 Programing in Lua 我发现书中的Sandboxing示例使用了该函数setfenv 改变给定函数的环境 但是在 lua 5 2 中这个函数不再可用 我尝试将文件 配置文
  • WPF DataGrid:如何将列设置为 TextWrap?

    我不确定为什么我的代码没有正确执行 TextWrapping 它不会包装 描述 列的文本 这正是我想要的 它只是将其切断 甚至没有使用 来让我知道还有更多数据 我尝试使用在网上找到的代码来完成这项工作 但没有成功 理想情况下 我希望能够仅将
  • 通过XPath提取属性节点的值

    如何通过 XPath 提取属性节点的值 示例 XML 文件是
  • C++20 标准对于将主题用作模板非类型参数有何规定?

    The 模板非类型参数 文章 模板参数和模板参数 的段落指出 唯一的例外是引用的非类型模板参数 或指针类型以及引用或指针的非静态数据成员 输入类类型及其子对象的非类型模板参数 C 20 起 不能引用 成为以下地址 临时对象 包括在引用初始化
  • 通过 Google Chrome 扩展访问本地文件?

    我需要从本地文件将名称列表加载到我的 google chrome 扩展中 如何才能做到这一点 如果文件本身附带扩展名怎么办 如果此文件随您的扩展一起提供 那么您可以使用以下命令加载它XMLHttpRequest内部背景页面 使用相对路径 带
  • 嵌入式(ASP.NET)网络服务器[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在寻找适用于 NET 的轻量级可嵌入 Web 服务器 我需要它来伪造 SOAP Web 服务以进行自动化测试 因此如果它支持 ASP NET W
  • jQuery Ajax 到 asp.net asmx Web 服务抛出请求格式无效:application/json

    我让 jquery 使用整数调用 asp net web 服务 在我们移植到 net 4 0 的旧应用程序上 我无法让此调用正常工作 我可以调用一个没有参数的方法 但将数据发送到 Web 方法会返回以下错误 System InvalidOp
  • 如何在 Android 设备中检测来电?

    我正在尝试制作一个应用程序 例如当电话打来电话时我想检测号码 以下是我尝试过的方法 但它没有检测到来电 我想运行我的MainActivity在后台 我该怎么做 我已给予许可manifest file
  • 我应该如何构建一个简单的 ASP.NET MVC 应用程序?

    我一直在阅读一些有关 ASP NET MVC SOLID 等的内容 并且正在尝试为中小型 ASP NET MVC 应用程序找出一个简单的 秘诀 将这些概念整合在一起 我最关心的问题是控制器过于复杂 就像网络表单中的代码隐藏文件 其中包含所有
  • Cython 和 fortran - 如何在没有 f2py 的情况下一起编译

    最终更新 这个问题是关于如何写一个setup py这将编译一个 cython 模块 该模块可以像 C 一样直接访问 FORTRAN 代码 这是一个相当漫长而艰巨的解决方案旅程 但完整的混乱情况包含在下面作为上下文 原问题 我有一个扩展 它是
  • 无论系统是32位还是64位,int都是32位,long还是64位吗?

    在java中 无论体系结构是32位还是64位 int是否保证始终为32位大小和long为64位大小 Java 是平台无关的 所以int是 32 位 并且long是 64 位的
  • Android 开关 - 在开/关时更改开关背景

    does someone know how I can implement a switch like this in my application 或者如何更改标准开关打开 关闭时的背景颜色 以下是供您开始使用的示例 XML
  • 在泽西岛从 1.9 升级到 Jackson 2.0 不起作用

    我正在使用 Jackson 位于泽西岛 来序列化实体 并且我正在从 Jackson 1 9 迁移到 2 0 我跟着本指南 一开始似乎一切都很顺利 但仔细观察发现 Jackson 1 9 仍在用于序列化我的响应 因此忽略了我的 迁移的 Jac
  • 如何计算沿直线的镜像点?

    在二维平面中 我有一个点和一条线 如何获得沿着这条线的镜像点 当在计算机程序中完成类似的事情时 您可能需要处理的问题之一是仅使用整数算术 或尽可能多 来执行这些计算 假设输入是整数 尽可能以整数进行此操作是一个单独的问题 我不会在这里讨论
  • 如何获取子进程的完整返回值?

    我需要捕获子进程的返回值 问题是 使用等待进程 函数我只能捕获返回值的8位 WEXITSTATUS wstatus 返回子进程的退出状态 这包括 孩子状态参数的最低有效 8 位 在对 exit 3 或 exit 2 的调用中指定或作为参数指
  • 如何使用“sum(iterable,[])”展平嵌套列表? [复制]

    这个问题在这里已经有答案了 我正在使用Python 3 6 我遇到了以下方法来展平嵌套列表sum a 1 2 3 4 5 6 sum a 返回 1 2 3 4 5 6 这里究竟发生了什么 Sum 接受一个可迭代对象 在本例中是一个列表 和一
  • Python 中两个范围列表的交集

    我的一个朋友向我传递了他最近收到的一个面试问题 我对我的解决方案不太满意 问题如下 你有两个清单 每个列表将包含长度为 2 的列表 表示一个范围 即 3 5 表示从 3 到 5 含 的范围 您需要返回集合之间所有范围的交集 如果我给你 1