原文: Python Find in List – How to Find the Index of an Item or Element in a List

在本文中,你将学习如何在 Python 编程语言中查找列表中包含的元素的索引。

有几种方法可以实现这一点。这里我将介绍三种方法:

  • 使用 index() 列表方法查找索引
  • 使用 for 循环
  • 使用列表推导式和 enumerate() 函数

具体来说,以下是我们将深入介绍的内容:

  • Python 中列表的概述
  • 索引的工作原理
  • 使用 index() 方法查找项目的索引(在 index() 方法中使用可选参数)
  • 获取列表中所有项目的索引
  • 使用 for 循环获取列表中所有项目的索引
  • 使用列表推导式和 enumerate() 函数获取列表中所有项目的索引

Python 中的列表是什么

列表是 Python 中的一种内置数据类型,也是最强大的数据结构之一。

它们充当容器并以相同的变量名称存储多个通常是相关的项目。

项目被放在方括号 [] 内。方括号内的每一项都用逗号 , 分隔。

# a list called 'my_information' that contains strings and numbers
my_information = ["John Doe", 34, "London", 1.76]

从上面的示例中,你可以看到列表可以包含任何数据类型的项目,这意味着列表元素可以是异构的。

与仅存储相同类型项目的数组不同,列表具有更大的灵活性。

列表也是可变的,这意味着它们是动态的。你可以更新列表项,可以将新项添加到列表中,并且可以在程序的整个生命周期中随时删除任何项。

Python 中的索引概述

如前所述,列表是项目的集合。具体来说,它们是项目的有序集合,并且其中的项目具有一定的顺序。

列表中的每个元素都有一个唯一的位置来标识它。

该位置叫作元素的索引。

Python 和很多编程语言中的索引是从 0 开始,而不是 1

让我们看一下上一节中使用的列表:

my_information = ["John Doe", 34, "London", 1.76]

该列表是零索引的,计数从 0 开始。

第一个列表元素 “John Doe” 的索引为 0
第二个列表元素 34 的索引为 1
第三个列表元素 “London” 的索引为 2
第四个列表元素 1.76 的索引为 3

索引对于访问你知道其位置(索引)的特定列表项很有用。

因此,你可以使用索引来获取你想要的任何列表元素。

要访问一个项目,首先包含列表的名称,然后在方括号中包含与你要访问的项目的索引对应的整数。

以下是使用索引访问每个项目的方法:

my_information = ["John Doe", 34, "London", 1.76]

print(my_information[0])
print(my_information[1])
print(my_information[2])
print(my_information[3])

#output

#John Doe
#34
#London
#1.76

但是如何在 Python 中查找列表项的索引呢?

在接下来的部分中,你将看到一些查找列表元素索引的方法。

使用 Python 中的 List index() 方法查找项目的索引

到目前为止,你已经了解了如何通过引用它的索引来访问一个值。

但是,当你不知道索引并且正在处理一个大列表时会发生什么?

你可以给出一个值并找到它的索引,然后检查它在列表中的位置。

为此,Python 的内置 index() 方法可以被用作搜索工具。

index() 方法的语法如下所示:

my_list.index(item, start, end)

让我们分解一下:

  • my_list 是你正在搜索的列表的名称。
  • .index() 是采用三个参数的搜索方法,一个参数是必需的,另外两个是可选的。
  • item 是必需的参数,它是你要搜索其索引的元素。
  • start 是第一个可选参数,这是你开始搜索的索引。
  • end 是第二个可选参数,这是你将结束搜索的索引。

让我们看一个仅使用必需参数的示例:

programming_languages = ["JavaScript","Python","Java","C++"]

print(programming_languages.index("Python"))

#output
#1

在上面的示例中,index() 方法只接受一个参数,即你要查找其索引的元素。

请记住,你传递的参数是区分大小写的。这意味着如果你传递的是 “python”,而不是 “Python”,你将收到一个错误,因为带有小写 “p” 的 “python” 不是列表的一部分。

返回值是一个整数,它是作为参数传递给方法的列表项的索引。

让我们看另一个例子:

programming_languages = ["JavaScript","Python","Java","C++"]

print(programming_languages.index("React"))

#output
#line 3, in <module>
#    print(programming_languages.index("React"))
#ValueError: 'React' is not in list

如果你尝试搜索一个项目,但你正在搜索的列表中没有匹配项,Python 将抛出一个错误作为返回值——它会返回一个 ValueError

这意味着你要搜索的项目在列表中不存在。

防止这种情况发生的一种方法是将对 index() 方法的调用放在 try/except 块中。

如果该值不存在,控制台将显示一条消息,说明它未存储在列表中,因此不存在。

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

try:
    print(programming_languages.index("React"))
except ValueError:
    print("That item does not exist")
    
#output
#That item does not exist

另一种方法是首先检查项目是否在列表中,然后再查找其索引。输出将是一个布尔值——它将是 True 或 False。

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

print("React" in programming_languages)

#output
#False

如何在 index() 方法中使用可选参数

让我们看一下下面的例子:

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

print(programming_languages.index("Python"))

#output
#1

programming_languages 列表中有正在搜索的 “Python” 字符串的三个实例。

作为一种测试方式,你可以向后工作,因为在这种情况下,列表很小。

你可以计算出它们的索引,然后像在前几节中看到的那样引用它们:

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

print(programming_languages[1])
print(programming_languages[3])
print(programming_languages[5])

#output
#Python
#Python
#Python

一个在位置 1,另一个在位置 3,最后一个在位置 5

为什么使用 index() 方法时它们没有显示在输出中?

使用 index() 方法时,返回值只是列表中第一次出现的项目,其余的实例不返回。

index() 方法只返回项目第一次出现的位置的索引。

你可以尝试将可选的 startend 参数传递给 index() 方法。

你已经知道第一次出现从索引 1 开始,因此这可以是 start 参数的值。

对于 end 参数,你可以首先找到列表的长度。

要查找长度,请使用 len() 函数:

print(len(programming_languages)) 

#output is 6

end 参数的值将是列表的长度减 1。列表中最后一项的索引始终比列表的长度小 1。

因此,将所有这些放在一起,你可以尝试获取该项目的所有三个实例:

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

print(programming_languages.index("Python",1,5))

#output
#1

输出仍然只返回第一个实例!

虽然 startend 参数为你的搜索提供了一个位置范围,但使用 index() 方法时的返回值仍然只是列表中第一次出现的项目。

如何获取列表中某个项目的所有出现的索引

使用 for 循环获取列表中某个项目的所有出现的索引

让我们以我们在上面使用的相同示例为例。

该列表出现了三个字符串 “Python”。

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

首先,创建一个新的空列表。

这将是存储 “Python” 所有索引的列表。

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

python_indices = []

接下来,使用 for 循环。这是一种遍历(或循环)列表的方法,并获取原始列表中的每个项目。具体来说,我们遍历每个项目的索引。

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

python_indices = []

for programming_language in range(len(programming_languages)):

你首先使用 for 关键字。

然后创建一个变量,在本例中为 programming_language,它将在迭代过程中充当原始列表中每个项目的位置的占位符。

接下来,你需要指定 for 循环应执行的迭代次数。

在这种情况下,循环将遍历列表的整个长度,从开始到结束。语法 range(len(programming_languages)) 是一种访问列表 programming_languages 中所有项目的方法。

range() 函数接受一个数字序列,这些数字指定它应该开始计数的数字和应该结束计数的数字。

len() 函数计算列表的长度,因此在这种情况下,计数将从 0 开始并在 6 结束(但不包括 6)。

最后,你需要设置一个逻辑条件,表达:“如果在迭代期间,给定位置的值等于 ‘Python’,则将该位置添加到我之前创建的新列表中”。

你使用 append() 方法将元素添加到列表中。

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

python_indices = []

for programming_language in range(len(programming_languages)):
    if programming_languages[programming_language] == "Python":
      python_indices.append(programming_language)

print(python_indices)

#output

#[1, 3, 5]

使用列表推导式和 enumerate() 函数获取列表中某个项目的所有出现的索引

查找特定项目所有出现的索引的另一种方法是使用列表推导式。

列表推导是一种基于现有列表创建新列表的方法。

以下是如何使用列表推导获取每次出现的字符串 “Python” 的所有索引:

programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]

python_indices  = [index for (index, item) in enumerate(programming_languages) if item == "Python"]

print(python_indices)

#[1, 3, 5]

使用 enumerate() 函数,你可以存储满足你设置的条件的项目的索引。

它首先为列表(programming_languages)中的每个元素提供一对(index, item),作为参数传递给函数。

index 是列表项的索引号,item 是列表项本身。

然后,它充当一个计数器,从 0 开始计数,并在每次满足你设置的条件时递增,选择并移动满足你条件的项目的索引。

与列表推导式配对,使用字符串 “Python” 的所有索引创建一个新列表。

总结

好啦,你现在知道了在 Python 的列表中查找项目索引的一些方法,以及查找项目多次出现的索引的方法。

我希望你觉得这篇文章有用。

要了解有关 Python 编程语言的更多信息,请查看 freeCodeCamp 的 Python 和科学计算认证。你将从基础开始,通过对初学者友好的互动方式来学习。最后,你还将构建五个项目以巩固所学的知识。

感谢你阅读本文,祝你编程愉快!