Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从字典中完全删除项目的Pythonic方法_Python_Dictionary - Fatal编程技术网

从字典中完全删除项目的Pythonic方法

从字典中完全删除项目的Pythonic方法,python,dictionary,Python,Dictionary,我想知道是否有一种从字典中完全删除条目的方法。为了说明这一点,考虑下面给出的DICT: 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'

我想知道是否有一种从字典中完全删除条目的方法。为了说明这一点,考虑下面给出的DICT:

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']}

当然,我可以通过循环它的键和值来获得它。但是,我想知道是否有更好的方法来做到这一点

否,这里除了一整套循环之外没有其他选项,因为您需要从值中删除任何
'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\u node\u map
确定要在删除节点时更新哪些列表。当然,你必须对任何突变保持索引的最新


如果订单不重要且节点是唯一的,您也应该考虑用<代码> SETS替换<代码>列表>代码>值。从集合中删除元素要高效得多,只需要在
mydict
的所有值上循环,而不用在列表的元素上嵌套循环。结合反向索引,您可以更高效地删除节点。

我认为python中没有简单的行答案。也许你可以试试:

  mydict.pop('E', None) 
这将从字典中删除带有“E”的键。现在删除“E”值:

for key in mydict.keys(): 
    mydict[key].remove('E')
有关此方法的更多参考信息,请访问:


希望有帮助

@tobias_k:这些值也需要清理。@MartijnPieters啊,谢谢你指出。完全错过了那部分!只是一个元注释:作为键出现的“E”与作为值的列表中的条目出现的“E”完全不同。因此,没有统一的方法来处理这两种情况也就不足为奇了。好吧,我想可能有一个我不知道的神奇命令。谢谢你的评论和回答。从字典里弹出键,然后再把它放回去是没有用的;只要
mydict[key]。删除('E')
就行了。我只能同意!
for key in mydict.keys(): 
    mydict[key].remove('E')