Python: Find in list
我遇到过这个:
1 2 3 | item = someSortOfSelection() if item in myList: doMySpecialFunction(item) |
但有时它不适用于我的所有项目,就好像它们在列表中未被识别(当它是一个字符串列表时)。
这是在列表中查找项目的最"pythonic"方式:
至于你的第一个问题:那个代码非常好,如果
至于你的第二个问题:如果在列表中"找到"东西,实际上有几种可能的方法。
检查里面是否有东西
这是您描述的用例:检查列表中是否有内容。如您所知,您可以使用
1 | 3 in [1, 2, 3] # => True |
过滤集合
也就是说,查找序列中满足特定条件的所有元素。您可以使用列表推导或生成器表达式:
1 2 | matches = [x for x in lst if fulfills_some_condition(x)] matches = (x for x in lst if x > 6) |
后者将返回一个生成器,您可以将其想象为一种惰性列表,只有在您遍历它时才会构建它。顺便说一句,第一个完全等同于
1 | matches = filter(fulfills_some_condition, lst) |
在Python 2中,您可以在这里看到更高阶的函数。在Python 3中,
找到第一次出现
如果你只想要第一个匹配条件的东西(但你还不知道它是什么),可以使用for循环(也可能使用
1 | next(x for x in lst if ...) |
如果没有找到,将返回第一个匹配或提高
1 | next((x for x in lst if ...), [default value]) |
查找项目的位置
对于列表,还有
1 2 | [1,2,3].index(2) # => 1 [1,2,3].index(4) # => ValueError |
但请注意,如果您有重复项,
1 | [1,2,3,2].index(2) # => 1 |
如果有重复项并且您想要所有索引,则可以使用
1 | [i for i,x in enumerate([1,2,3,2]) if x==2] # => [1, 3] |
如果要在
1 | first_or_default = next((x for x in lst if ...), None) |
虽然Niklas B.的答案非常全面,但当我们想要在列表中找到一个项目时,获取其索引有时很有用:
1 | next((i for i, x in enumerate(lst) if [condition on x]), [default value]) |
找到第一次出现
在
1 2 3 4 5 6 7 8 9 10 11 12 | 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) |
例如,以下代码查找列表中的第一个奇数:
1 2 | >>> first_true([2,3,4,5], None, lambda x: x%2==1) 3 |
另一种选择:您可以检查项目是否在
1 2 3 | my_set = set(my_list) if item in my_set: # much faster on average than using a list # do something |
在每种情况下都不会是正确的解决方案,但在某些情况下,这可能会给您带来更好的性能。
请注意,使用
如果在列表中找到x返回x的索引,或者如果找不到x则返回
定义和用法
句法
1 | list.count(value) |
例:
1 2 3 | fruits = ['apple', 'banana', 'cherry'] x = fruits.count("cherry") |
问题的例子:
1 2 3 4 5 | item = someSortOfSelection() if myList.count(item) >= 1 : doMySpecialFunction(item) |
1 2 3 4 5 6 7 8 9 10 | list = [10, 20, 30, 40, 50] n = int(input(" Enter a Number to search from the list :")) if n in list : print(" Match found") else : print(" Match not found") |
在处理字符串列表时,您可能希望使用两种可能的搜索之一:
如果list元素等于一个项目('example'在中
[ '一', '示例', '二'):
'''','ex','two']中的'ex'=>真
'ex_1'在['one','ex','two'] => False
如果列表元素就像一个项目('ex'在
['one,'example','two']或'example_1'就在
[ '一', '示例', '二'):
要么
然后只需检查
检查字符串列表中的项目中是否没有其他/不需要的白色空格。
这是一个可以干扰解释无法找到物品的原因。
例如,如果要查找大于30的所有元素的索引:
1 2 3 4 | your_list = [11,22,23,44,55] filter(lambda x:your_list[x]>30,range(len(your_list))) #result: [3,4] |