![](/img/trans.png)
[英]what would be the most pythonic way of finding items from a list of OrderedDict?
[英]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
中找到元素。 您可以假設維護list
和set
,但更新操作將花費線性時間。
你提到你的動機是
列表而非集合主要是由於需要考慮列表中的重復項目。 集不允許重復。
並要求不要專注於這個例子。 如果這是你的動機,你可能想要使用而不是一個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.