簡體   English   中英

python列表的兩個“包含”操作之間的區別

[英]Difference between two “contains” operations for python lists

我是python的新手,發現我需要查詢列表是否包含某個項目。
我在各種網站上看到的大多數帖子(包括類似的stackoverflow問題 )都提出了類似的建議

for i in list
    if i == thingIAmLookingFor
        return True

但是,我也從一個單獨的論壇中找到了

if thingIAmLookingFor in list
    # do work

作品。

我想知道if thing in list方法中的if thing in list是否為for i in list方法的簡寫,或者是否以不同方式實現。

如果有的話,我也希望哪一個更受歡迎。

在您簡單的例子,它當然更好地使用in

但是 ......在你鏈接到的問題中in 不起作用 (至少不是直接),因為OP不想找到一個等於某個東西的對象,而是一個屬性n等於某個東西的對象。

一個答案 確實使用何況in一個列表理解,雖然我不知道為什么沒有被用來代替發電機表達式:

if 5 in (data.n for data in myList):
    print "Found it"

但這與其他方法相比幾乎沒有什么改進,比如這個使用any

if any(data.n == 5 for data in myList):
    print "Found it"

“if in in thing:”格式是首選格式,不僅因為它占用的代碼較少,而且還適用於其他數據類型,並且(對我而言)更易於閱讀。

我不確定它是如何實現的,但我希望它在以更易搜索的形式存儲的數據類型上效率更高。 例如。 集或字典鍵。

if thing in somelistif thing in somelist是首選且最快的方式。

使用in-operator轉換為somelist.__contains__(thing)其實現等同於: any((x is thing or x == thing) for x in somelist)

注意條件測試身份然后是相等。

for i in list
    if i == thingIAmLookingFor
        return True

以上是測試一個項目是否存在於集合中的可怕方法。 它從函數返回 True ,因此如果您需要將測試作為某些代碼的一部分,則需要將其移動到單獨的實用程序函數中,或者在循環之前添加thingWasFound = False並在if語句中將其設置為True (和然后打破),其中任何一行都是幾行樣板,可以是一個簡單的表達式。

另外,如果您只是thingIAmLookingFor in list使用thingIAmLookingFor in list ,則可以通過執行更少的Python級別操作來更有效地執行(它需要執行相同的操作,但可能在C中,因為list是內置類型)。 但更重要的是,如果list實際上是綁定到其他集合就像一組或一本字典thingIAmLookingFor in list將使用哈希查找機制這種類型的支持和有效得多 ,而使用for循環將迫使Python來瀏覽每項目依次。

強制性的后腳本: list是一個變量的可怕名稱,它包含一個列表,因為它會影響內置list ,這會讓您或任何讀取代碼的人感到困惑。 你最好把它命名為能夠告訴你它意味着什么的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM