繁体   English   中英

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

[英]Pythonic way to delete an item completely from a dictionary

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

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

不,这里没有其他选项而不是一整套循环,因为您需要从值中删除任何'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查明要删除节点时要更新的列表。 当然,你必须使指数与任何突变保持同步。

如果顺序不重要且节点是唯一的,您还应该考虑用set s替换list值。 从集合中删除元素要高效得多,并且只需要循环遍历mydict所有值, mydict在列表的元素上放弃嵌套循环。 结合反向索引,您可以更有效地删除节点。

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

  mydict.pop('E', None) 

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

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

可以在以下位置找到有关此方法的进一步参考: Python Docs

希望能帮助到你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM