2012-12-13 29 views
0

下面的代碼:python3 - 學習搜索,這個很簡單的例子不工作的權利

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

出於某種原因,這並不工作,我認爲它應該工作的方式。

當我運行這個,它會說「找不到」。但是,如果我將要查找的值更改爲列表中的第一個項目,那麼它將返回爲「找到」。

我已經試過用字符串,我得到了相同的結果。

有人能告訴我我做錯了什麼嗎?

+0

只是一個建議,你可以簡化功能,「發現」如果事情在別的ALIST「未找到」' – John

回答

5

因爲如果在第一次迭代中該項不匹配,則進入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" 
+0

@丹D.請不要截斷其他用戶的帖子,因爲編碼的個人喜好'回報樣式。修改其他用戶的帖子以糾正錯別字等。 – Hyperboreus

+0

我同意你的意見,丹應該添加評論。另一方面,答案是初學者,信息劑量應該使用正確大小的滴劑。刪除的代碼實際上意味着:*使用這種複雜的方式將名稱命名爲未命名的函數。* – pepr

+0

感謝您提供此信息。雖然我明白這不是最有效的編碼方式,但這個類是爲絕對初學者設計的。如你所知,在完全理解像for循環這樣簡單的事情之前,我還有很長的路要走。 –

2

@hyperboreus pointed out the cause of the error(在else分支之前的所有項目執行被視爲)。

要找到一個分類(「有序」)列表萬件二進制搜索將需要大約一個項目,你可以使用bisect module執行的,而不是線性搜索item in alistO(n))如二進制搜索(O(log(n))針對線性搜索的數百萬次操作進行幾十次操作。

from bisect import bisect 

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

+1對分;這對我來說是一個新的。 –

+0

確實如此,但是這是假設列表是有序的。 – John

+0

@John:'findsort'名稱表示輸入已排序,但問題中的示例列表未排序。我已經大膽地避免可能的混淆。 – jfs