如何在 Python 列表中查找项目的索引

如何在 Python 列表中查找元素的索引

本指南将深入探讨在 Python 列表中定位元素索引的不同方法。我们将涵盖使用简单迭代和 Python 内置的 index() 方法。

在处理 Python 列表时,你经常需要确定特定元素的位置。可以通过两种主要方式实现:

  • 通过遍历列表,并检查当前位置的元素是否与目标值匹配。
  • 通过使用列表内置的 index() 方法。

本教程将详细介绍这两种方法。 让我们开始探索吧! 👩🏽‍💻

重新审视 Python 列表

Python 中的列表是项目(可以是相同或不同的数据类型)的有序集合。它们是可变的,这意味着你可以在不创建新列表的情况下修改它们。

考虑以下水果列表,其中包含 5 种不同的水果:

fruits = ["apple", "mango", "strawberry", "pomegranate", "melon"]

使用内置的 len() 函数,你可以获取任何 Python 对象(包括列表)的长度。将 fruits 列表传递给 len() 函数,你将得到它的长度:

len(fruits)
# 输出: 5

在本教程中,我们将使用这个水果列表作为示例。

Python 列表中的索引

Python 采用零索引,这意味着列表中的第一个元素位于索引 0,第二个元素位于索引 1,依此类推。 如果列表的长度为 k,那么最后一个元素位于索引 k-1。

在 Python 中,range() 函数可以帮助我们在遍历列表时获取索引。

当遍历 range(k) 时,你将得到索引 0, 1, 2, …, k-1。 通过将 k 设置为列表的长度,你可以获得所有有效的索引。

以下代码展示了这一点:

for i in range(len(fruits)):
  print(f"i:{i}, fruits[{i}] is {fruits[i]}")

# 输出
i:0, fruits[0] is apple
i:1, fruits[1] is mango
i:2, fruits[2] is strawberry
i:3, fruits[3] is pomegranate
i:4, fruits[4] is melon

现在我们已经了解了 Python 列表的基础知识,让我们深入研究如何在列表中查找元素的索引。

使用 for 循环迭代查找列表项的索引

让我们继续使用之前的水果列表。我们将学习如何通过迭代(使用 for 循环)来查找特定元素的索引。

使用 for 循环和 range() 函数

我们首先定义要查找的目标值。

使用 for 循环和 range() 函数,我们可以生成从 0 到 len(fruits)-1 的索引列表:

  • 遍历列表的每个索引。
  • 检查当前索引 i 处的元素是否与目标值匹配。
  • 如果匹配,则打印出目标值在索引 i 处找到。
fruits = ["apple", "mango", "strawberry", "pomegranate", "melon"]

target = "mango"

for i in range(len(fruits)):
  if fruits[i] == target:
    print(f"{target} 在索引 {i} 处找到")

# 输出
mango 在索引 1 处找到

在此示例中,目标字符串 “mango” 在 fruits 列表中仅出现一次(在索引 1 处)。

但是,目标值有时会出现多次,甚至根本不出现。 为了处理这些情况,我们将上面的循环包装在一个名为 find_in_list 的函数中。

理解函数定义

函数 find_in_list 接受两个参数:

  • target:要搜索的值。
  • py_list:要搜索的 Python 列表。
def find_in_list(target, py_list):
  target_indices = []
  for i in range(len(py_list)):
    if py_list[i] == target:
      target_indices.append(i)
  if not target_indices:
    print("抱歉,未找到目标值!")
  else:
    print(f"{target} 在索引 {target_indices} 处找到")

在函数内部,我们初始化一个空列表 target_indices。 我们遍历列表并访问每个元素。 如果在特定索引处找到了目标值,我们使用 append() 方法将该索引添加到 target_indices 列表中。

请注意:在 Python 中,list.append(item)item 添加到列表的末尾。

  • 如果从未找到目标值,target_indices 将是一个空列表,并会通知用户该目标值不在列表中。
  • 如果在多个索引处找到目标值,则 target_indices 将包含所有这些索引。

接下来,让我们修改水果列表,如下所示:

现在我们搜索目标字符串 “mango”,它出现了两次,分别在索引 1 和 4 处。

fruits = ["apple", "mango", "strawberry", "pomegranate", "mango", "melon"]
target = "mango"
find_in_list(target, fruits)

# 输出
mango 在索引 [1, 4] 处找到

当我们使用目标值和水果列表作为参数调用函数 find_in_list 时,我们看到两个索引都被返回了。

target = "turnip"
find_in_list(target, fruits)

# 输出
抱歉,未找到目标值!

如果我们尝试搜索水果列表中不存在的 “turnip”,我们会收到一条消息,指出未找到目标值。

使用 for 循环和 enumerate() 函数

在 Python 中,你可以使用 enumerate() 函数同时访问索引和元素,而无需使用 range() 函数。

以下代码展示了如何使用 enumerate() 函数来获取索引和元素:

fruits = ["apple", "mango", "strawberry", "pomegranate", "mango", "melon"]
for index, fruit in enumerate(fruits):
  print(f"索引 {index}: {fruit}")

# 输出
索引 0: apple
索引 1: mango
索引 2: strawberry
索引 3: pomegranate
索引 4: mango
索引 5: melon

现在,让我们重写 Python 函数,使用 enumerate() 函数查找列表中元素的索引。

def find_in_list(target, py_list):
  target_indices = []
  for index, fruit in enumerate(py_list):
    if fruit == target:
      target_indices.append(index)
  if not target_indices:
    print("抱歉,未找到目标值!")
  else:
    print(f"{target} 在索引 {target_indices} 处找到")

就像之前一样,我们可以使用有效的参数来调用 find_in_list 函数。

上述函数定义也可以转换为等效的列表推导式,我们将在下一节中介绍。

使用列表推导式通过迭代查找列表项的索引

Python 中的列表推导式允许我们根据某些条件从现有列表创建新列表。 其通用结构如下:

new_list = [<output> for <items in existing iterables> if <condition is true>]

下图描述了如何识别列表推导式的组成部分。借助此图,可以将函数 find_in_list 转换为列表推导式。

通过使用上述结构,用于创建目标索引的列表推导式如下:

target_indices = [index for index, fruit in enumerate(fruits) if fruit == target]

你可以尝试运行上面的代码片段,并尝试其他一些示例作为练习。

使用 index() 方法查找列表项的索引

要在 Python 列表中查找元素的索引,还可以使用内置的 .index() 方法。其通用语法如下:

list.index(value, start, end)

对上述方法进行解析:

  • value 是要搜索的目标值。
  • startend 是可选的位置参数。你可以使用它们在列表切片中搜索元素的索引,从 start 开始,一直延伸到 end-1

请注意:.index() 方法仅返回元素在列表中第一次出现的索引。即使你在列表切片 [start: end-1] 中找到了元素的索引,此方法也只会返回与第一次出现的元素对应的索引。

让我们重新回顾一下示例,了解 .index() 方法的工作原理。

fruits = ["apple", "mango", "strawberry", "pomegranate", "mango", "melon"]
target = "mango"

fruits.index(target)
# 输出 1

即使 “mango” 在水果列表中出现两次,你也只会看到第一次出现的索引被返回。

要获取第二次出现 “mango” 的索引,我们可以从索引 2 开始,一直到索引 5 的列表切片中进行搜索,如下所示:

fruits.index(target, 2, 5)
# 输出 4

如何在 Python 中处理 ValueError

现在让我们看看,如果我们尝试查找列表中不存在的元素的索引(例如 “carrot”)会发生什么:

target = "carrot"

fruits.index(target)

# 输出
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-17-81bd454e44f7> in <module>()
      1 target = "carrot"
      2 
----> 3 fruits.index(target)

ValueError: 'carrot' is not in list

如上面的代码单元所示,这将引发 ValueError 错误。在 Python 中,你可以使用 try 和 except 块将其作为异常处理。

使用 try-except 的通用语法如下:

try:
  # 执行此操作
except <ErrorType>:
  # 执行此操作来处理 <ErrorType> 异常

通过使用上面的 try-except 块,我们可以将 ValueError 作为异常处理:

target = "carrot"
try:
  fruits.index(target)
except ValueError:
  print(f"抱歉,在列表中未找到 {target}")

# 输出
抱歉,在列表中未找到 carrot

上面的代码执行以下操作:

  • 如果目标值存在于列表中,则返回目标值的索引。
  • 如果目标值不存在,则将 ValueError 作为异常处理,并打印出错误消息。

总结

以下总结了你在 Python 列表中查找元素索引的不同方法:

  • 你可以使用 Python 的 for 循环和 range() 函数来获取元素及其各自的索引。检查索引处的元素是否与目标值匹配。
  • 你还可以使用 enumerate() 函数同时访问元素和索引。
  • 你可以在列表推导式中使用上述两种方法。
  • 要查找列表中元素的索引,还可以使用内置的 .index() 方法。
  • list.index(value) 返回列表中第一次出现 value 的索引。如果该值不存在,则会引发 ValueError
  • 你可以使用 list.index(value, start, end) 来搜索列表的某个切片,以查找列表切片 [start:end-1] 中出现的值。

接下来,学习如何按键或按值对 Python 字典进行排序。祝你 Python 编程愉快!