Python:在列表中查找

新手上路,请多包涵

我使用以下内容检查 item 是否在 my_list 中:

 if item in my_list:
    print("Desired item is in list")

但有时,它找不到该项目。为什么是这样?


if item in my_list: ”是在列表中查找项目的最“pythonic”方式吗?

原文由 Stephane Rolland 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 586
2 个回答

至于您的第一个问题:“ if item is in my_list: ”非常好,如果 item 等于 my_list 中的一个元素,则应该可以工作。该项目必须与列表中的项目 完全 匹配。例如, "abc""ABC" 不匹配。特别是浮点值可能会受到不准确的影响。例如, 1 - 1/3 != 2/3

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

检查里面是否有东西

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

 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 中。在这里您可以看到正在工作的高阶函数。在 Python 3 中, 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

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

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

如果有重复并且您想要所有索引,那么您可以使用 enumerate() 代替:

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

原文由 Niklas B. 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果你想找到一个元素或 Nonenext --- 中使用默认值,它不会引发 StopIteration 如果在列表项中找不到:

 first_or_default = next((x for x in lst if ...), None)

原文由 Janusz Skonieczny 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题