【问题标题】:python3 - learning about searching, this very simple example does not work rightpython3 - 学习搜索,这个非常简单的例子不能正常工作
【发布时间】:2012-11-30 21:47:56
【问题描述】:

代码如下:

def findsort(something, alist):
    for item in alist:
        if item == something:
            return "found"
        else:
            return "not found"

def main():

    print(findsort(6, [3, 6, 1, 8, 11, 14]))

main()

由于某种原因,这并不像我认为的那样工作。

当我运行它时,它会说“未找到”。但是,如果我将要查找的值更改为列表中的第一项,即 3,它会返回为“已找到”。

我已经用字符串尝试过这个,我得到了相同的结果。

谁能告诉我我做错了什么?

【问题讨论】:

  • 只是一个建议,您可以将该功能简化为return "found" if something in alist else "not found"

标签: python list sorting search python-3.x


【解决方案1】:

因为如果在第一次迭代中项目不匹配,你进入 else 分支返回“未找到”,从而退出循环。

试试这个:

def findsort(something, alist):
    for item in alist:
        if item == something:
            return "found"
    return "not found"

或者简单地说:

def findsort(something, alist):
    return "found" if something in alist else "not found"

【讨论】:

  • @Dan D. 请不要因为个人对编码风格的偏好而截断其他用户的帖子。一定要修改其他用户的帖子,以纠正错别字等。
  • 我同意你的观点,Dan 应该添加评论。另一方面,答案是初学者,信息剂量应该使用正确的滴剂大小。删除的代码实际上意味着:使用这种复杂的方式为未命名的函数命名。
  • 感谢您提供此信息。虽然我知道这不是最有效的编码方式,但这个课程是为绝对初学者设计的。如您所知,在完全理解像 for 循环这样简单的东西之前,我还有很长的路要走。
  • 不客气。考虑接受这些答案中的任何一个,这样人们才会有动力回答您的问题。
【解决方案2】:

@hyperboreus pointed out the cause of the error(else 分支在看到所有项目之前执行)。

要在 已排序(“有序”)列表中查找项目,您可以使用执行二分搜索 (O(log(n)) 的 bisect module 而不是线性搜索 item in alist (O(n))例如,对于一百万个项目,二进制搜索需要大约几十个操作,而线性搜索的一百万个操作。

from bisect import bisect

findsort = lambda x, L: "found" if L and L[bisect(L,x) - 1] == x else "not found"

【讨论】:

  • 是的,但这假设列表是有序的。
  • @John: findsort 名称表明输入已排序,但问题中的示例列表未排序。为了避免可能的混淆,我已将其加粗。
  • @J.F.Sebastian 是的,这是一个奇怪的名字。尽管如此,二分搜索+1。对不起,我的意思是输入“有序升序”,但我必须间隔。
  • 谢谢你,但我是编程新手,我什至无法理解你刚刚写的东西。不过看起来很甜。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 2014-01-27
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 2012-08-29
相关资源
最近更新 更多