2014-07-22 65 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

我什么都不能做,只能答应! –