簡體   English   中英

大多數Pythonic方法在O(1)復雜度的列表中查找/檢查項目?

[英]Most Pythonic way to find/check items in a list with O(1) complexity?

我面臨的問題是在O(1)復雜度的列表中查找/檢查項目。 以下具有O(n)的復雜性:

'foo' in list_bar

這具有O(n)的復雜性,因為您in list中使用了in關鍵字。 (參考Python時間復雜度

但是,如果in set上使用in關鍵字,則其復雜度為O(1)。

我需要弄清楚列表的O(1)復雜性而不是集合的原因主要是由於需要考慮列表中的重復項目。 集不允許重復。 一個很好的例子是:

chars_available = ['h', 'e', 'l', 'o', 'o', 'z']
chars_needed = ['h', 'e', 'l', 'l', 'o']

def foo(chars_available, chars_needed):
    cpy_needed = list(chars_needed)
    for char in cpy_needed:
        if char in chars_available:
            chars_available.remove(char)
            chars_needed.remove(char)
        if not chars_needed: return True  # if chars_needed == []
    return False

foo(chars_available, chars_needed)

這個例子不是重點,所以請盡量不要偏離它。 重點仍然是試圖在列表中查找項目時獲得O(1)復雜性。 我怎么能蟒蛇化?

(作為額外的功勞,如果您確實希望以Python,偽代碼或其他語言顯示更好的方式來執行該操作,我將很樂意閱讀它)。

謝謝!

編輯:

為了回應Ami Tavory的回答,我了解到你不能比O(n)更快地創建列表,但對collections.Counter()的建議幫助解決了我正在處理的應用程序。 我正在為Stack Overflow上傳我更快的解決方案,性能非常出色! 如果我沒有弄錯(如果我錯了,請糾正我),它應該是O(1),因為它只涉及可散列值而沒有循環迭代。

from collections import Counter
chars_available = ['h', 'e', 'l', 'o', 'o', 'z']
chars_needed = ['h', 'e', 'l', 'l', 'o']

def foo(chars_available, chars_needed):
    counter_available = Counter(chars_available)
    counter_needed = Counter(chars_needed)
    out = counter_needed - counter_available
    if not list(out.elements()): return True
    else: return False

foo(chars_available, chars_needed)

非常快,非常pythonic! 謝謝!

通常,不可能在恆定時間list中找到元素。 您可以假設維護listset ,但更新操作將花費線性時間。

你提到你的動機是

列表而非集合主要是由於需要考慮列表中的重復項目。 集不允許重復。

並要求不要專注於這個例子。 如果這是你的動機,你可能想要使用而不是一個set ,一個dict將每個元素映射到它的出現次數。

您可能會發現collections.Counter特別有用:

In [1]: from collections import Counter

In [2]: Counter(['h', 'e', 'l', 'o', 'o', 'z'])
Out[2]: Counter({'e': 1, 'h': 1, 'l': 1, 'o': 2, 'z': 1})

暫無
暫無

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

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