首页 > 编程问答 >如何有效检查列表中 x 是否出现在 y 之前

如何有效检查列表中 x 是否出现在 y 之前

时间:2024-07-28 15:57:21浏览次数:10  
标签:python algorithm performance

给定Python中的列表 L ,以及保证位于 x 中的两个元素 y L ,我想知道 x 是否出现在 y L 之前。

如果只有一对,我可以简单地循环 L 直到找到 x y 这所花费的时间与 L 的长度成线性关系。但是,我必须回答许多此类相同 L (不同 x y )的查询。有没有一种有效的方法,也许是Python中的数据结构或迭代器,我可以用它来快速回答许多相同的查询 L


可以通过预处理列表 L 来创建一个字典,将每个元素映射到它的索引,从而有效地检查列表中 x 是否出现在 y 之前。然后,可以使用该字典快速检查任何对 (x, y) 的索引。

以下是方法:

def check_order(L, pairs):
    """
    检查列表 L 中多个对中 x 是否出现在 y 之前。

    Args:
        L: 包含元素的列表。
        pairs: (x, y) 对的列表,其中 x 和 y 是 L 中的元素。

    Returns:
        一个布尔值列表,对应于每个对的结果。 
    """

    # 创建一个字典,将每个元素映射到它的索引
    element_indices = {element: index for index, element in enumerate(L)}

    # 检查每个对
    results = []
    for x, y in pairs:
        if element_indices[x] < element_indices[y]:
            results.append(True)
        else:
            results.append(False)

    return results

# 示例用法
L = [1, 2, 3, 4, 5]
pairs = [(1, 3), (4, 2), (3, 5)]

results = check_order(L, pairs)
print(results)  # 输出:[True, False, True]

说明:

  1. 预处理:
  2. 我们创建一个名为 element_indices 的字典。
  3. 我们遍历列表 L ,并将每个 element 及其 index 存储在字典中。这样可以让我们稍后通过其索引高效地检索元素。

  4. 检查对:

  5. 我们遍历 pairs 列表中的每个对 (x, y)。
  6. 对于每个对,我们使用字典 element_indices 检索 x y 的索引。
  7. 如果 x 的索引小于 y 的索引,则表示 x L 中出现在 y 之前,我们将 True 追加到 results 列表中。否则,我们将 False 追加到列表中。

  8. 返回值:

  9. 函数 check_order 返回一个布尔值列表 results ,其中每个值对应于输入 pairs 列表中相应对的结果。

时间复杂度:

  • 预处理步骤的时间复杂度为 O(n),其中 n 是 L 的长度。
  • 检查对步骤的时间复杂度为 O(m),其中 m 是对的数量。

空间复杂度:

  • 字典 element_indices 的空间复杂度为 O(n)。

通过预处理列表 L ,我们只需要对每个对执行一次恒定时间的查找操作,从而使其更有效率。这种方法在需要针对同一个列表执行多个查询时特别有用。

标签:python,algorithm,performance
From: 78803220

相关文章

  • [附开题]flask框架的校园疫情管理系统92tl0(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着新冠疫情的持续影响,校园作为人群密集、流动性大的场所,其疫情防控工作显得尤为重要。传统的手工记录和口头报告方式已难以满足当前复杂......
  • 如何从 python 脚本将事件和上下文传递到 AWS lambda?
    我正在创建一个cli应用程序,我想用它来调用我的AWSlambda函数:@click.group(context_settings={"help_option_names":["-h","--help"]},invoke_without_command=True)@click.version_option(version=__version__,prog_name="experiment")def......
  • 有没有办法检查是否有人提到@youtubechannelname并使用youtube数据api让Python脚本回
    标题解释了大部分内容。我的问题是,尽管到处搜索,但我没有找到任何有用的解决方案。AI和ChatGPT都无法对此提供帮助。不幸的是,YouTube数据API不提供直接监控频道提及或自动回复评论的功能。YouTube数据API主要用于检索和管理YouTube上的视频、评论和其他资源,而......
  • 如何在 Python 中从 Milesight TrafficX 摄像头、Post(MQTT、TCP/IP、HTTP) 获取数据?
    你好,祝你度过愉快的一天或一夜,我有这个MilesightTrafficX摄像头已启动并正在运行,仪表板中有一个名为POST的设置,您可以在下图中看到:我想要的是知道如何设置这些设置(基于实际上我的意思是)能够在我的Python代码中接收数据。无论协议如何,数据都将如下所示:......
  • 如何循环使用按钮输入,在python中的不同选项之间循环?
    我有一个循环,它采用三路开关输入并在相机开机时选择一个选项:#SetGPIOinputswitchColorOne=pyb.Pin("P9",pyb.Pin.IN,pyb.Pin.PULL_UP)switchColorTwo=pyb.Pin("P7",pyb.Pin.IN,pyb.Pin.PULL_UP)#SetcolorpalletebyswitchifswitchColorOne.value()==0:......
  • SSL 证书验证失败 - 雅虎财经 API - Python
    我正在尝试从雅虎财经获取数据,但收到SSL错误。代码如下:importrequestsresponse=requests.get("https://query1.finance.yahoo.com/v8/finance/chart/META",verify=True)print(response.status_code)出现以下错误:urllib3.exceptions.SSLError:[SSL:CERTIFICATE_......
  • 【学习笔记】Matlab和python双语言的学习(熵权法)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、熵权法的基本概念二、熵权法的基本步骤1、构建决策矩阵2、数据标准化3、计算指标的比重4、计算信息熵5、计算权重6、计算综合得分三、代码实现----Matlab四、代码实现----python总结......
  • 【python】网络通信编程例子
    以下是一个简单的Python示例,展示了如何在Linux下使用套接字进行基本的网络通信,包括创建服务器和客户端。服务器端代码importsocket#创建一个IPv4TCP套接字server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#绑定服务器地址和端口server_addr......
  • 如何将Python版本从3.9降级到3.7?
    我正在开发RaspberryPi。这些是我的操作系统信息:pi@raspberrypi:~$uname-marmv7lpi@raspberrypi:~$cat/etc/os-releasePRETTY_NAME="RaspbianGNU/Linux11(bullseye)"NAME="RaspbianGNU/Linux"VERSION_ID="11"VERSION="11(bullseye)......
  • Python终端输出彩色字符方法
    colorama是一个python专门用来在控制台、命令行输出彩色文字的模块,完全兼容linux和windows各个版本。 1.Python3.x中安装colorama模块: pipinstallcolorama'''可用格式常数:【颜色RED,GREEN都需要大写】Fore:BLACK,RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,WHI......