2016-05-23 40 views
0

我有一個非常大的dict,我想從del很多元素。也許我應該這樣做:如何刪除非常大的字典中的許多元素?

new_dict = { key:big_dict[key] for key in big_dict if check(big_dict[key] } 

不過,我沒有足夠的內存,以保持兩者old_dictnew_dict在RAM中。有什麼辦法可以處理?


地址:

我不能刪除元素一個接一個。我需要對值進行測試,以查找我想要刪除的元素。

我也不能在德爾元素循環,如:

for key in dic: 
    if test(dic(key)): 
     del dic[key] 

它區分一個錯誤...在循環無法更改LEN(DIC)...

我上帝......我甚至不能讓一套記憶鍵,刪除鍵,有太多的鍵...

我看,如果dict類沒有這樣做的功能,也許唯一的方法要做到這一點是要bug新電腦...

+1

您可以使用數據庫。 –

+3

使用簡單的'for'循環和'del'有什麼問題? – ozgur

+0

[從字典中刪除元素]的可能重複(http://stackoverflow.com/questions/5844672/delete-an-element-from-a-dictionary) –

回答

1

這裏有一些選擇:

  • 使磁盤上的一個新的「字典」,爲此,pickleshelve可能會有所幫助。
  • 迭代並建立一個鍵列表,直到它達到一定的大小,刪除它們,然後再次重複迭代,使您每次都可以創建一個更大的列表。
  • .keys()的索引存儲要刪除的密鑰,這可以提高內存使用效率。只要字典未在.keys()的調用之間修改,就可以。如果大約一半的元素將被刪除,則使用二進制sequeunce(1 = delete,0 = keep)執行此操作。如果要刪除絕大多數元素(或不刪除),則將相應的鍵作爲整數存儲在列表中。
+0

看來這是唯一的方法......我確信我應該買一臺新電腦...... –

1

你可以嘗試通過字典迭代和刪除你不

del big_dict[key] 

這樣你就不會需要的元素製作字典的副本。

+0

我無法逐個刪除元素。而且我也無法在for循環中刪除元素,就像:for key in dic:if test(dic(key)):del key,它會出現一個錯誤...我甚至無法記住什麼去del,那裏有太多的關鍵,我有一點記憶......也許我應該得到一個更強大的電腦。 –

+0

您正在使用的計算機的規格是什麼? – Altronicx