目录
Find the index of elements that meet a condition in Python
在Python中查找满足条件的元素索引
查找满足条件的元素的索引:
- 使用列表理解来迭代
range
对象。 - 检查是否满足条件,如果满足则返回相应的索引。
- 新列表将只包含满足条件的元素的索引。
my_list = [4, 8, 12, 16, 25] indexes = [ index for index in range(len(my_list)) if my_list[index] > 10 ] print(indexes) # 👉️ [2, 3, 4]
我们使用
列表理解来迭代包含range
列表中索引的对象。
范围类通常用于循环特定次数。
my_list = [4, 8, 12, 16, 25] print(list(range(len(my_list)))) # 👉️ [0, 1, 2, 3, 4] print(list(range(5))) # 👉️ [0, 1, 2, 3, 4]
我们使用列表的长度来构造一个range
包含列表中所有索引的对象。
在每次迭代中,我们检查当前列表项是否大于10
并返回结果。
my_list = [4, 8, 12, 16, 25] indexes = [ index for index in range(len(my_list)) if my_list[index] > 10 ] print(indexes) # 👉️ [2, 3, 4]
新列表只包含满足条件的元素的索引。
您可以使用此方法获取列表中满足任何条件的元素的索引。
my_list = ['bobby', 'ab', 'cd', 'bobbyhadz.com'] indexes = [ index for index in range(len(my_list)) if my_list[index].startswith('bobby') ] print(indexes) # 👉️ [0, 3]
该示例查找以特定子字符串开头的元素的索引。
使用 NumPy 查找满足条件的元素的索引
如果你使用 NumPy,你也可以使用该numpy.where()
方法。
import numpy as np my_list = np.array([4, 8, 12, 16, 25]) indexes = np.where(my_list > 10)[0] print(indexes) # 👉️ [2 3 4] indexes = np.nonzero(my_list > 10)[0] print(indexes) # 👉️ [2 3 4]
确保安装
了 NumPy 模块以便能够运行代码示例。
pip install numpy # 👇️ or pip3 pip3 install numpy
当只提供一个条件时,
numpy.where
方法返回满足条件的元素的索引。
或者,您可以使用for 循环。
使用for循环查找满足条件的元素索引
这是一个四步过程:
- 声明一个存储空列表的新变量。
- 使用
for
循环迭代原始列表enumerate()
。 - 检查每次迭代是否满足条件。
- 将匹配的索引附加到新列表。
my_list = [4, 8, 12, 16, 25] indexes = [] for index, item in enumerate(my_list): if item > 10: indexes.append(index) print(indexes) # 👉️ [2, 3, 4]
我们使用该enumerate()
函数来访问当前迭代的索引。
enumerate函数接受一个可迭代对象并返回一个包含元组的枚举对象,其中第一个元素是索引,第二个元素是相应的项目。
my_list = ['bobby', 'hadz', 'com'] for index, item in enumerate(my_list): print(index, item) # 👉️ 0 bobby, 1 hadz, 2 com
在每次迭代中,我们检查当前元素是否满足条件。
如果满足条件,我们使用该list.append()
方法将当前索引附加到新列表。
list.append ()方法将一个项目添加到列表的末尾。
my_list = ['bobby', 'hadz'] my_list.append('com') print(my_list) # 👉️ ['bobby', 'hadz', 'com']
该方法在改变原始列表时返回 None 。
获取第一个符合条件的列表元素的索引
要获取与条件匹配的第一个列表元素的索引:
- 使用生成器表达式迭代列表
enumerate()
。 - 检查每个列表项是否满足条件,并返回对应的索引。
- 将结果传递给
next()
函数。
my_list = [2, 14, 29, 34, 72, 105] index_first_match = next( (index for index, item in enumerate(my_list) if item > 29), None ) print(index_first_match) # 👉️ 3 if index_first_match is not None: print(my_list[index_first_match]) # 👉️ 34
我们将
生成器表达式传递
给next()
函数。
我们使用该enumerate()
函数来访问当前迭代的索引。
enumerate函数接受一个可迭代对象并返回一个包含元组的枚举对象,其中第一个元素是索引,第二个元素是相应的项目。
my_list = ['bobby', 'hadz', 'com'] for index, item in enumerate(my_list): print(index, item) # 👉️ 0 bobby, 1 hadz, 2 com
在每次迭代中,我们检查当前列表项是否大于29
,如果满足条件,我们返回当前索引。
next ()函数从提供的迭代器返回下一个项目。
该函数可以传递一个默认值作为第二个参数。
如果迭代器耗尽或为空,则返回默认值。
StopIteration
我们指定了默认值,None
但您可以使用任何其他值。
my_list = [2, 14, 29] index_first_match = next( (index for index, item in enumerate(my_list) if item > 29), None ) print(index_first_match) # 👉️ None if index_first_match is not None: print(my_list[index_first_match]) else: # 👇️ this runs print('No list element meets the condition')
列表中没有一项满足条件,所以
None
返回默认值 。
或者,您可以使用for
循环。
使用 for 循环获取第一个匹配条件的列表元素的索引
这是一个三步过程:
- 使用
for
循环遍历列表enumerate()
。 - 检查每个列表项是否满足条件。
- 如果满足条件,则将相应的索引赋给一个变量。
my_list = [2, 14, 29, 34, 72, 105] index_first_match = None for index, item in enumerate(my_list): if item > 29: index_first_match = index break print(index_first_match) # 👉️ 3 if index_first_match is not None: # 👇️ this runs print(my_list[index_first_match]) # 👉️ 34 else: print('No list element meets the condition')
我们使用for
循环来迭代一个enumerate
对象。
在每次迭代中,我们检查当前列表项是否满足条件。
如果满足条件,我们将当前索引分配给index_first_match
变量并退出for
循环。
break语句跳出最内层的封闭或for
循环while
。
一旦找到满足条件的列表项,就无需继续迭代。
如果列表中没有项目满足条件,则index_first_match
变量保持不变None
。
如果你需要找到所有满足条件的列表元素的索引,将它们存储在一个列表中。
my_list = [4, 8, 14, 27, 35, 87] indices = [] for index, item in enumerate(my_list): if item > 8: indices.append(index) print(indices) # 👉️ [2, 3, 4, 5]
We removed the break
statement and used the list.append()
method to append
the matching indices to the list.
The list.append() method
adds an item to the end of the list.
my_list = ['bobby', 'hadz'] my_list.append('com') print(my_list) # 👉️ ['bobby', 'hadz', 'com']
Which approach you pick is a matter of personal preference. I’d use the next()
function because it’s just as readable and a little more concise.
# Additional Resources
You can learn more about the related topics by checking out the following
tutorials:
- Find index of First, Last or Nth occurrence in Python String
- How to filter a List of Dictionaries in Python
- Filter a List of Strings using a Wildcard in Python
- Find a common substring between two strings in Python
- Find common values in multiple Lists in Python
- Find dictionary items by Partial Key match in Python
- 在一个列表中查找不在另一个列表中的元素(Python)