在Python中按索引查找列表元素

2025年1月4日 | 阅读7分钟

下面的教程将指导您了解在 Python 编程语言中按列表中的索引查找列表数据元素的各种方法。问题将在探讨各种潜在解决方案之前得到彻底的解释。

按索引查找列表数据元素

问题

给定两个包含元素和索引的列表,编写一个 Python 程序来查找列表 2 中存在的索引处的列表 1 的项。

示例 1

输入

输出

 
[9, 15, 54, 98]   

示例 2

输入

输出

 
['Javatpoint', 'is', 'Wonderful']   

解决方案

为了使用 Python 编程语言按索引查找列表元素,我们可以使用各种方法。其中一些方法列在下面

  1. 使用列表推导(朴素方法)
  2. 使用 map() 方法
  3. 使用 itemgetter() 方法
  4. 使用 NumPy
  5. 使用字典
  6. 使用递归

现在让我们逐一讨论这些方法及其实现来解决我们的问题。

方法 1:使用列表推导(朴素方法)

使用列表推导是定位所需组件的第一种方法。我们遍历 'secondList',为每个 i 元素生成 firstList[i]。

示例

输出

 
[9, 15, 54, 98]   

说明

此 Python 程序中的 findDataElements(firstList, secondList) 方法接受两个列表作为输入。它将返回 firstList(firstList)中索引在 secondList(secondList)中的成员,作为新列表。为此,该函数利用了列表推导。

  • 时间复杂度:O(n),其中 n 是 secondList 的长度。
  • 辅助空间:O(m),其中 m 是返回列表的长度。

方法 2:使用 map() 方法

Python map() 是按索引查找数据元素的另一种选择。这里,firstList.__getitem__ 应用于 secondList,并为 secondList 中的每个元素 'i' 返回 firstList[i]。

示例

输出

 
[9, 15, 54, 98]   

说明

此 Python 程序中的 findDataElements(firstList, secondList) 方法接受两个列表作为输入。它将返回 firstList(firstList)中索引在 secondList(secondList)中的成员,作为新列表。为此,该函数结合使用 __getitem__ 方法和 map 函数。

  • 时间复杂度:O(n),其中 n 是 secondList 的长度。
  • 辅助空间:O(m),其中 m 是 secondList 的长度。

方法 3:使用 itemgetter() 方法

示例

输出

 
[9, 15, 54, 98]   

说明

此 Python 程序中的 findDataElements(firstList, secondList) 方法接受两个列表作为输入。它将返回 firstList(firstList)中索引在 secondList(secondList)中的成员,作为新列表。使用 secondList 中提供的索引,利用 operator 模块中的 itemgetter 函数可以有效地从 firstList 中检索组件。

  • 时间复杂度:O(m),其中 m 是 secondList 列表的长度。
  • 辅助空间:O(m+k),其中 k 是返回列表的长度。

方法 4:使用 NumPy

示例

输出

 
[9, 15, 54, 98]   

说明

此 Python 程序中的 findDataElements(firstList, secondList) 方法使用 NumPy 根据 secondList 中提供的索引从 firstList 中查找项。将 firstList 转换为 NumPy 数组后,它使用 secondList 进行数组索引来提取相关元素。最后,返回包含结果的列表。

  • 该程序的时间复杂度为 O(n),其中 n 是 secondList 的长度。
  • 该程序的空间复杂度为 O(n),其中 n 是 secondList 的长度。

方法 5:使用字典

使用此方法,将创建一个将 secondList 索引映射到匹配的 firstList 条目的字典。之后,我们可以使用列表推导从字典中检索值。

首先,此代码中会创建一个名为 indexMap 的字典,该字典将 firstList 的索引映射到相关项。接下来,我们使用列表推导从 indexMap 中检索 secondList 中索引的值。最后,我们提供结果,即提取值的列表。

示例

输出

 
[9, 15, 54, 98]   

说明

提供的函数 findDataElements(firstList, secondList) 的输入是两个列表,firstList 和 secondList。通过将 secondList 中的索引与 firstList 中的匹配条目链接起来,它会生成一个字典 indexMap。接下来,使用 secondList 中提供的索引,它使用列表推导从 firstList 中提取数据元素。最终,返回一个包含这些提取组件的列表。当使用列表 [9, 15, 21, 38, 54, 73, 98] 和 [0, 1, 4, 6] 调用 findDataElements(firstList, secondList) 时,它将返回 [9, 15, 54, 98],这些分别是 firstList 中索引 0、1、4 和 6 处的项。

  • 时间复杂度: O(n)
  • 辅助空间:O(n)

方法 6:使用递归

算法

  • 创建一个名为 findDataElements 的方法,该方法接受两个列表 firstList 和 secondList,一个可选的索引 i(默认为 0),以及一个列表 result(默认为 [])。
  • 如果 i == secondList 的长度,则返回 result(基本情况)。
  • 从 firstList 中提取 secondList[i] 索引处的元素,然后将其添加到 result。
  • 使用更新后的 i (i+1) 和 result 递归调用 findDataElements。
  • 一旦所有递归调用都完成,就返回 result 的最终值。

示例

输出

 
[9, 15, 54, 98]   

说明

findDataElements 方法使用 secondList 中提供的索引,迭代地从 firstList 中提取元素。它从一个名为 result 的空列表开始,并在每次递归调用时将 secondList 中相应元素提供的索引处的 firstList 中的元素附加到 result 中。一旦 secondList 中的所有索引都被处理完毕(递归结束),则返回 result 列表。当使用列表 [9, 15, 21, 38, 54, 73, 98] 和 [0, 1, 4, 6] 调用该函数时,将返回 firstList 中索引 0、1、4 和 6 处的项。

  • 时间复杂度:O(n),其中 n 是 secondList 的长度。我们对 secondList 中的每个元素都进行一次访问,并且从 firstList 的每个索引处获取元素所需的时间是恒定的。因此,时间复杂度取决于输入列表(secondList)的长度。
  • 辅助空间:O(n),其中 n 是 secondList 的长度。这是因为,假设 secondList 中的所有索引都有效,我们就必须存储 result 中的项列表,其最大长度可能为 n。此外,假设 secondList 中的每个索引都有效,递归调用会在调用堆栈上消耗内存,其深度可能达到 n。