从字典中彻底删除项目的Pythonic方式

3
我想知道是否有一种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']}

当然,我可以通过循环遍历其键和值来获取它。但是,我想知道是否有更好的方法来实现这一点。

@tobias_k:值也需要清理。 - Martijn Pieters
@MartijnPieters 啊,谢谢指出。完全没注意到那部分! - tobias_k
2
只是一点元注释:作为出现的'E'与作为列表中的出现的'E'是完全不同的东西。因此,没有统一处理两种情况的方法是不足为奇的。 - Andrew Jaffe
2个回答

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”的所有值,放弃对列表元素的嵌套循环。结合反向索引,您可以更有效地删除节点。

好的,我以为可能有一个神奇的命令我不知道。感谢您的评论和答案。 - T-800

0

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

  mydict.pop('E', None) 

这将从字典中删除带有'E'的键。现在要删除'E'值:

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

这些方法的更多参考资料可以在Python文档中找到。

希望能对你有所帮助!


1
从字典中弹出键,然后再将其设置回去是没有意义的;只需使用 mydict[key].remove('E') 即可。 - Martijn Pieters
我除了同意之外,别无选择! - Pablo Stark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接