我有一個作業流程,我可以在其中處理串列,并跟蹤我在字典中看到的串列 - 因為當我找到已經看過的串列時,我可以傳遞它。需要注意的是,具有相同元素以不同順序排列的兩個串列被認為是重復的。所以舉一個整數串列的簡單例子:[3, 1, 5, 6]和[5, 3, 6, 1]是等價的。
我一直這樣做是,tuple(sorted(L))把它放在我的字典里。所以對于上面的例子seen看起來像:
seen = {..., (1, 3, 5, 6): 1, ...}
這具有對我可能需要處理的每個串列進行持續時間查找的好處。然而,問題是為了檢查給定的串列是否在 中seen,我必須對其進行tuple(sorted(L))處理。事實證明,對于大量資料,這會占用我整個程序總時間的 50% 以上,這變得令人望而卻步。
我想以collections.Counter某種方式使用- 因為Counter[3, 1, 5, 6]并且Counter[5, 3, 6, 1]會評估相等。但是 Counter 物件不能用作 dict 鍵。如何在不執行上述排序操作的情況下繼續查找字典?提前致謝。
編輯:在查看使用建議時,frozenset我意識到我遺漏了一件重要的事情,那就是元素可以復制。因此,盡管上述兩個串列比較相等,[3, 1, 5, 6]并且[3, 3, 1, 5, 6, 6]需要被看作是不同的。由于該frozenset操作會洗掉重復項,因此此處不提供此選項。
uj5u.com熱心網友回復:
正如其他人指出的那樣,frozenset 是您的最佳選擇:
seen = set()
list_1, list_2, list_3 = [3, 1, 5, 6], [5, 3, 6, 1], [1, 2, 3]
print(frozenset(list_1) in seen)
seen.add(frozenset(list_1))
print(frozenset(list_1) in seen)
print(frozenset(list_2) in seen)
print(frozenset(list_3) in seen)
frozenset將一個可迭代物件作為引數,因此實體化該集合將花費 O(n)。set根據之前的回應,查找平均為 O(1),與標準相同。無論哪種方式,您都可以節省非常昂貴的排序操作,即 O(n log n)。
uj5u.com熱心網友回復:
如果你有很多重復的,那么也許使用frozenset的Counter專案?
>>> from collections import Counter
>>> frozenset(Counter([3, 3, 1, 5, 6, 6]).items())
frozenset({(1, 1), (3, 2), (6, 2), (5, 1)})
或排序的Counter專案元組:
>>> tuple(sorted(Counter([3, 3, 1, 5, 6, 6]).items()))
((1, 1), (3, 2), (5, 1), (6, 2))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/322329.html
