def first_true(iterable, default=False, pred=None):
"""Returns the first true value in the iterable.
If no true value is found, returns *default*
If *pred* is not None, returns the first item
for which pred(item) is true.
"""
# first_true([a,b,c], x) --> a or b or c or x
# first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
return next(filter(pred, iterable), default)
list = [10, 20, 30, 40, 50]
n = int(input("\nEnter a Number to search from the list : "))
if n in list :
print("\nMatch found")
else :
print("\nMatch not found")
9 回答
例如,如果要查找大于30的所有元素的索引:
Finding the first occurrence
在
itertools
中有一个配方:例如,以下代码查找列表中的第一个奇数:
至于你的第一个问题:那个代码完全正常,如果
item
等于myList
中的一个元素,它应该可以工作 . 也许你试图找到一个与其中一个项不完全匹配的字符串,或者你正在使用一个浮点值,它会受到不准确的影响 .至于你的第二个问题:如果在列表中“找到”东西,实际上有几种可能的方式 .
检查内部是否有东西
这是您描述的用例:检查某些内容是否在列表中 . 如您所知,您可以使用
in
运算符:过滤集合
也就是说,查找序列中满足特定条件的所有元素 . 您可以使用列表推导或生成器表达式:
后者将返回一个生成器,您可以将其想象为一种惰性列表,只有在您遍历它时才会构建它 . 顺便说一句,第一个完全等同于
在Python 2中,您可以在这里看到高阶函数 . 在Python 3中,
filter
不返回列表,而是返回类似于生成器的对象 .查找第一次出现
如果你只想要第一个与条件相匹配的东西(但你不能使用for循环(也可能使用
else
子句,这不是很有名) . 你也可以使用如果没有找到,将返回第一场比赛或举起
StopIteration
. 或者,您可以使用查找项目的位置
对于列表,还有
index
方法,如果您想知道列表中某个元素的位置,它有时会很有用:但请注意,如果您有重复项,
.index
始终返回最低索引:......如果有重复项并且您想要所有索引,则可以使用
enumerate()
代替:如果要在
next
中找到一个元素或None
使用默认值,如果在列表中找不到该项,则不会引发StopIteration
:虽然Niklas B.的答案非常全面,但当我们想要在列表中找到一个项目时,获取其索引有时很有用:
检查字符串列表中的项目中是否没有其他/不需要的白色空格 . 这是一个可能干扰解释无法找到的项目的原因 .
在处理字符串列表时,您可能希望使用两种可能的搜索之一:
if item in your_list: some_function_on_true()
'''','ex','two']中的'ex'=>真
'ex_1'在['one','ex','two'] => False
matches = [el for el in your_list if item in el]
要么
matches = [el for el in your_list if el in item]
然后只需检查
len(matches)
或根据需要阅读它们 .另一种选择:您可以使用
if item in list:
检查项目是否在列表中,但这是订单O(n) . 如果您正在处理大项目列表,而您需要知道的是某些内容是否是列表的成员,您可以先将列表转换为集合并利用constant time set lookup:在每种情况下都不会是正确的解决方案,但在某些情况下,这可能会给您带来更好的性能 .
请注意,使用
set(my_list)
创建集合也是O(n),因此如果您只需要执行此操作,那么以这种方式执行此操作并不是更快 . 如果您需要重复检查成员资格,那么在初始集创建之后,每次查找都将为O(1) .