如何在 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
是要搜索的目标值。start
和end
是可选的位置参数。你可以使用它们在列表切片中搜索元素的索引,从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 编程愉快!