我想知道是否有一种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 :(得分: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
的所有值,从而在列表的元素上放弃嵌套循环。结合反向索引,您可以更有效地删除节点。
答案 1 :(得分:0)
我不认为python中有简单的回答。也许你可以试试:
mydict.pop('E', None)
这将从字典中删除带有'E'的键。现在删除'E'值:
for key in mydict.keys():
mydict[key].remove('E')
此方法的进一步参考可在以下网址找到:Python Docs
希望它有所帮助!