Python:在列表中查找
我遇到过这样的情况:Python:在列表中查找,python,find,Python,Find,我遇到过这样的情况: item = someSortOfSelection() if item in myList: doMySpecialFunction(item) 但有时它并不适用于我的所有项目,好像它们在列表中没有被识别(当它是一个字符串列表时) 这是在列表中查找项目的最“python”的方法吗:如果l中的x:?至于你的第一个问题:如果item等于myList中的一个元素,那么该代码就很好用了。可能您试图找到一个与其中一项不完全匹配的字符串,或者可能您使用的浮点值不准确 至于你
item = someSortOfSelection()
if item in myList:
doMySpecialFunction(item)
但有时它并不适用于我的所有项目,好像它们在列表中没有被识别(当它是一个字符串列表时)
这是在列表中查找项目的最“python”的方法吗:
如果l中的x:
?至于你的第一个问题:如果item
等于myList
中的一个元素,那么该代码就很好用了。可能您试图找到一个与其中一项不完全匹配的字符串,或者可能您使用的浮点值不准确
至于你的第二个问题:如果在列表中“查找”事物,实际上有几种可能的方法
检查里面是否有东西
这就是您描述的用例:检查列表中是否有内容。如您所知,您可以在操作符中使用:
3 in [1, 2, 3] # => True
matches = [x for x in lst if fulfills_some_condition(x)]
matches = (x for x in lst if x > 6)
筛选集合
也就是说,查找序列中满足特定条件的所有元素。您可以使用列表理解或生成器表达式:
3 in [1, 2, 3] # => True
matches = [x for x in lst if fulfills_some_condition(x)]
matches = (x for x in lst if x > 6)
后者将返回一个生成器,您可以将其想象为一种惰性列表,只有在您遍历它时才会构建它。顺便说一下,第一个完全等同于
matches = filter(fulfills_some_condition, lst)
在Python 2中。在这里你可以看到高阶函数在起作用。在Python3中,filter
不返回列表,而是返回一个类似生成器的对象
发现第一个事件
如果您只想要第一个匹配条件的东西(但您还不知道它是什么),那么可以使用for循环(也可以使用else
子句,它不是很有名)。你也可以使用
next(x for x in lst if ...)
它将返回第一个匹配项,或者在未找到任何匹配项时引发StopIteration
。或者,您可以使用
next((x for x in lst if ...), [default value])
查找项目的位置
对于列表,如果您想知道某个元素在列表中的位置,还可以使用index
方法:
[1,2,3].index(2) # => 1
[1,2,3].index(4) # => ValueError
first_or_default = next((x for x in lst if ...), None)
但是,请注意,如果有重复项,.index
始终返回最低的索引:
[1,2,3,2].index(2) # => 1
如果存在重复项并且需要所有索引,则可以使用enumerate()
:
[i for i,x in enumerate([1,2,3,2]) if x==2] # => [1, 3]
如果要查找一个元素或None
在next
中使用默认值,如果列表中未找到该项,则不会引发StopIteration
:
[1,2,3].index(2) # => 1
[1,2,3].index(4) # => ValueError
first_or_default = next((x for x in lst if ...), None)
检查字符串列表中的项目是否没有额外的/不需要的空格。
这是一个解释无法找到项目的原因。虽然Niklas B.的答案相当全面,但当我们想在列表中找到一个项目时,有时获取其索引很有用:
next((i for i, x in enumerate(lst) if [condition on x]), [default value])
查找第一个事件
在itertools
中有一个配方:
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)
例如,以下代码查找列表中的第一个奇数:
>>> first_true([2,3,4,5], None, lambda x: x%2==1)
3
在处理字符串列表时,您可能希望使用两种可能的搜索之一:
如果列表元素等于某个项目('example')
[‘一’、‘举例’、‘两’]):
if项目在您的\u列表中:某些\u函数在\u true()上。
['one'、'ex'、'two']中的'ex'=>True
['one'、'ex'、'two']中的'ex_1'=>False
如果列表元素与相似,则在
[one、'example'、'two'或'example_1'在
[‘一’、‘举例’、‘两’]):
matches=[如果el中有项目,则el代表您列表中的el]
或
matches=[el代表项目中的el时,列表中的el]
然后只需检查len(匹配项)
,或者根据需要阅读它们
另一种选择:如果列表中的项目:
,则可以使用检查列表中是否有项目,但这是顺序O(n)。如果您处理的是大型项目列表,您只需要知道某个项目是否属于您的列表中的一员,您可以先将列表转换为集合,然后利用:
并非在所有情况下都是正确的解决方案,但在某些情况下,这可能会给您带来更好的性能
请注意,使用set(my_list)
创建集合也是O(n),因此,如果只需要执行一次,那么这样做不会更快。如果您需要重复检查成员身份,那么在初始集合创建之后,每次查找都将是O(1)。而不是使用list.index(x)
,如果在列表中找到x,则返回x的索引;如果未找到x,则返回\ValueError
消息,您可以使用list.count(x)
返回x在列表中的出现次数(验证x是否确实在列表中),否则返回0(如果没有x)。count()
最酷的一点是,它不会破坏您的代码,也不会要求您在找不到x时抛出异常定义和用法
count()
方法返回具有指定值的元素数
语法
list.count(value)
示例:
fruits = ['apple', 'banana', 'cherry']
x = fruits.count("cherry")
item = someSortOfSelection()
if myList.count(item) >= 1 :
doMySpecialFunction(item)
问题示例:
fruits = ['apple', 'banana', 'cherry']
x = fruits.count("cherry")
item = someSortOfSelection()
if myList.count(item) >= 1 :
doMySpecialFunction(item)
如果您要检查一次收藏品中是否存在值,则可以使用“in”运算符。然而,如果您要检查不止一次,那么我建议使用对分模块。请记住,必须对使用对分模块的数据进行排序。所以,对数据进行一次排序,然后就可以使用对分了。在我的机器上使用对分模块比使用“in”操作符快12倍左右
下面是使用Python 3.8及以上语法的代码示例:
import bisect
from timeit import timeit
def bisect_search(container, value):
return (
(index := bisect.bisect_left(container, value)) < len(container)
and container[index] == value
)
data = list(range(1000))
# value to search
true_value = 666
false_value = 66666
# times to test
ttt = 1000
print(f"{bisect_search(data, true_value)=} {bisect_search(data, false_value)=}")
t1 = timeit(lambda: true_value in data, number=ttt)
t2 = timeit(lambda: bisect_search(data, true_value), number=ttt)
print("Performance:", f"{t1=:.4f}, {t2=:.4f}, diffs {t1/t2=:.2f}")
这很好,如果item等于myList
中的一个元素,它应该可以工作。你是说这是一种很好的方法吗?在我的几次试验中,可能有空格和换行符插入。。。我只是想确定这是实现“在列表中查找”的好方法(一般来说)Stephane:让我换一句话:如果列表中的x
不是人们抱怨的内置函数。他们抱怨说,没有明确的方法来解决这个问题