2014-07-22 77 views
3

我想知道是否有Python方式從字典中完全刪除項目。爲了說明的是,考慮到字典如下:Pythonic方式從字典中完全刪除項目

mydict = {'A': ['B', 'O'], 
      'B': ['A'], 
      'C': ['D', 'E', 'F', 'O'], 
      'D': ['E', 'C', 'F'], 
      'E': ['C', 'D', 'F', 'O'], 
      'F': ['C', 'D', 'E'], 
      'G': ['H', 'O'], 
      'H': ['G', 'O'], 
      'O': ['A', 'C', 'E', 'G', 'H']} 

而且讓我們說,我想從詞典中刪除'E'。然後我期待得到這樣的字典:

mydict = {'A': ['B', 'O'], 
      'B': ['A'], 
      'C': ['D', 'F', 'O'], 
      'D': ['C', 'F'], 
      'F': ['C', 'D', ], 
      'G': ['H', 'O'], 
      'H': ['G', 'O'], 
      'O': ['A', 'C', 'G', 'H']} 

當然,我可以通過循環其鍵和值來得到它。但是,我想知道是否有更好的方法來做到這一點。

+0

@tobias_k:這些值也需要清理。 –

+0

@MartijnPieters啊,謝謝你指出。完全錯過了那部分! –

+2

只是一個元註釋:顯示爲*鍵*的'E'與來自'E'的完全不同的野獸在列表*中顯示爲*條目,*是*值*。所以沒有統一的方法來處理這兩種情況應該不會令人感到意外。 –

回答

8

沒有,有沒有其他的選擇,這裏比全套循環的,因爲你需要從你的刪除任何'E'字符串:

{k: [i for i in v if i != 'E'] for k, v in mydict.iteritems() if k != 'E'} 

此重建你的字典,去除'E'鍵的同時,我們在這裏,給你留下一本完全是'E'的新字典。

如果你想要更有效率的東西,你需要添加更多的信息。例如位置的指標:

from collections import defaultdict 

reverse_node_map = defaultdict(set) 
for k, nodes in mydict.iteritems(): 
    for node in nodes: 
     reverse_node_map[node].add(k) 

,然後用reverse_node_map查明哪些列出更新時要刪除一個節點。當然,你必須保持索引與任何突變保持同步。

如果順序不重要且節點是唯一的,您還應考慮將list的值替換爲set。從集合中刪除元素效率更高,只需循環遍歷所有mydict的值,放棄列表元素上的嵌套循環。結合反向索引,您可以更有效地刪除節點。

+0

好吧,我想可能有一個我不知道的魔法命令。感謝您的意見和答覆。 –

0

我不認爲在Python中有一個簡單的行答案。也許你可以嘗試:

mydict.pop('E', None) 

這將從字典中刪除'E'鍵。現在去除「E」值:

for key in mydict.keys(): 
    mydict[key].remove('E') 

這種方法的進一步參考上可以找到:Python Docs

希望它能幫助!

+1

從字典中彈出密鑰沒有用處,然後重新設置;只是'mydict [key] .remove('E')'會做的。 –

+0

我什麼都不能做,只能答應! –