返回符合条件的列表中的第一个项目

14 浏览
0 Comments

返回符合条件的列表中的第一个项目

我有一个函数matchCondition(a),它接受一个整数并返回True或False。

我有一个包含10个整数的列表。我想要返回列表中第一个满足matchCondition返回True的项(与原始列表顺序相同)。

尽可能以Pythonic的方式实现。

0
0 Comments

问题的出现原因是要从一个列表中返回满足特定条件的第一个元素。解决方法是使用break语句来中断循环,并且将满足条件的元素赋值给变量x

代码示例中的循环遍历列表lis,并使用matchCondition()函数来判断是否满足条件。如果满足条件,就打印出当前元素并使用break语句中断循环。这样,变量x就包含了满足条件的第一个元素。

为了证明这个解决方法的有效性,代码示例中给出了一个for循环的例子。这个循环遍历了从0到9的整数,当x等于5时,使用break语句中断循环。最后输出的结果是x等于5,证明了解决方法的正确性。

然而,这种方法只适用于至少有一个满足条件的元素的情况。如果没有任何元素满足条件,那么它将返回列表中的最后一个元素collection[-1]。为了处理这种情况,可以使用for-else循环。

for-else循环的语法是在for循环结束后执行else语句块中的代码。如果for循环正常结束(即没有使用break语句中断循环),则执行else语句块中的代码。

通过使用for-else循环,可以在没有满足条件的元素时执行特定的代码块,而不是返回最后一个元素。这样可以更好地处理一些特殊情况。

以上就是解决问题的原因和解决方法的整理。通过使用break语句和for-else循环,可以从一个列表中返回满足特定条件的第一个元素,并且可以处理没有满足条件的元素的情况。

0
0 Comments

问题:如何从列表中返回满足条件的第一个元素?

原因:使用next(x for x in lst if matchCondition(x))可以实现返回满足条件的第一个元素,但是如果列表中没有元素满足条件,会引发StopIteration异常。为了解决这个问题,可以给next函数提供第二个参数,如next((x for x in lst if matchCondition(x)), None),这样如果没有匹配的元素,会返回None

解决方法示例:

>>> next(x for x in range(10) if x == 7)  #This is a silly way to write 7 ...
7
>>> next(x for x in range(10) if x == 11)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> next((x for x in range(10) if x == 7), None)
7
>>> print next((x for x in range(10) if x == 11), None)
None

补充说明:如果要返回列表中所有满足条件的元素,可以使用内置函数filter,在Python2.x中返回列表,在Python3.x中返回可迭代对象。

相关讨论:

- 使用生成器表达式的性能相对较差,对于小型列表来说,并不能从短路的优势中获得任何好处。在很多应用程序中,[x for x in lst if matchCondition(x)][0]可能更快(或者使用相应的filter表达式,但这在Python2和Python3兼容性上存在问题)。

- 另一种解决方法是([x for x in lst if matchCondition(x)] or [None])[0],但这样写非常丑陋。

- 性能并不是一切,虽然方法不同,但也应该记录下来,以表明这种方法并不总是最好的性能选择。

通过给next函数提供第二个参数,可以在列表中返回满足条件的第一个元素,并且在没有匹配结果的情况下返回None。如果需要返回所有满足条件的元素,可以使用filter函数。

0