Python:在列表中查找

Python: Find in list

我遇到过这个:

1
2
3
item = someSortOfSelection()
if item in myList:
    doMySpecialFunction(item)

但有时它不适用于我的所有项目,就好像它们在列表中未被识别(当它是一个字符串列表时)。

这是在列表中查找项目的最"pythonic"方式:if x in l:


至于你的第一个问题:那个代码非常好,如果item等于myList中的一个元素,它应该可以工作。也许你试图找到一个与其中一个项不完全匹配的字符串,或者你正在使用一个浮点值,它会受到不准确的影响。

至于你的第二个问题:如果在列表中"找到"东西,实际上有几种可能的方法。

检查里面是否有东西

这是您描述的用例:检查列表中是否有内容。如您所知,您可以使用in运算符:

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中,filter不返回列表,而是返回类似于生成器的对象。

找到第一次出现

如果你只想要第一个匹配条件的东西(但你还不知道它是什么),可以使用for循环(也可能使用else子句,这并不是很有名) 。你也可以使用

1
next(x for x in lst if ...)

如果没有找到,将返回第一个匹配或提高StopIteration。或者,您可以使用

1
next((x for x in lst if ...), [default value])

查找项目的位置

对于列表,还有index方法,如果您想知道列表中某个元素的位置,它有时会很有用:

1
2
[1,2,3].index(2) # => 1
[1,2,3].index(4) # => ValueError

但请注意,如果您有重复项,.index始终返回最低索引:......

1
[1,2,3,2].index(2) # => 1

如果有重复项并且您想要所有索引,则可以使用enumerate()

1
[i for i,x in enumerate([1,2,3,2]) if x==2] # => [1, 3]


如果要在next中找到一个元素或None使用默认值,如果在列表中找不到该项,则不会引发StopIteration

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])

找到第一次出现

itertools中有一个配方:

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

另一种选择:您可以检查项目是否在if item in list:的列表中,但这是订单O(n)。如果您正在处理大项目列表,并且您需要知道的是某些内容是否是列表的成员,您可以先将列表转换为集合并利用常量时间集查找:

1
2
3
my_set = set(my_list)
if item in my_set:  # much faster on average than using a list
    # do something

在每种情况下都不会是正确的解决方案,但在某些情况下,这可能会给您带来更好的性能。

请注意,使用set(my_list)创建集合也是O(n),因此如果您只需要执行此操作,那么以这种方式执行此操作并不是更快。如果您需要重复检查成员资格,那么在初始集创建之后,每次查找都将为O(1)。


如果在列表中找到x返回x的索引,或者如果找不到x则返回#ValueError消息,而不是使用list.index(x),而不是使用list.count(x)返回列表中x的出现次数(验证 x确实在列表中)或者否则返回0(在没有x的情况下)。 关于count()的一个很酷的事情是它不会破坏你的代码或者要求你在找不到x时抛出异常


定义和用法

count()方法返回具有指定值的元素数。

句法

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'在中
    [ '一', '示例', '二'):

    if item in your_list: some_function_on_true()

    '''','ex','two']中的'ex'=>真

    'ex_1'在['one','ex','two'] => False

  • 如果列表元素就像一个项目('ex'在
    ['one,'example','two']或'example_1'就在
    [ '一', '示例', '二'):

    matches = [el for el in your_list if item in el]

    要么

    matches = [el for el in your_list if el in item]

    然后只需检查len(matches)或在需要时阅读它们。


  • 检查字符串列表中的项目中是否没有其他/不需要的白色空格。
    这是一个可以干扰解释无法找到物品的原因。


    例如,如果要查找大于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]