Python中的字典列表
我在Python中有一个字典的列表:
dico_cfg = {'name': entry_name, 'ip': entry_ip, 'vendor': combo_vendor, 'stream': combo_stream}
self.list_cfg.append(dico_cfg)
我用同样的方式往这个列表里添加了很多字典。
现在我想从这个列表中删除一个字典,而且只想删除一个。请问有什么好的方法吗?
我试过用列表的索引来删除,但当我从列表中移除一个字典后,索引就会改变,所以在随机删除后,我的索引就不再对应我想删除的字典了。我希望这样说清楚了。
也许我可以在我的字典里加一个“id”字段,这样我就可以更准确地指定要删除的字典。我会要求删除那个“id”等于我想删除的字典的“id”的字典。
我该怎么做呢?
希望我说得够清楚。抱歉,我在Python方面还是个新手。
5 个回答
1
你提到的识别那些多了一个条目的字典,确实是个不错的主意:
dico_cfg = {'name': entry_name, 'ip': entry_ip, 'vendor': combo_vendor,
'stream': combo_stream, 'id': 'dico_cfg'}
self.list_cfg.append(dico_cfg)
然后后面会有
self.list_cfg[:] = [d for d in self.list_cfg if d.get('id') != 'dico_cfg']
注意,我是在给完整列表切片(也就是用[:]
这种写法)赋值,而不是给列表的名字赋值。给名字赋值有时候看起来好像有效,但其实并没有改变列表的内容(只是重新绑定了一个名字),所以如果还有其他地方引用了这个列表,它们的内容不会受到影响。总之,给名字赋值(而不是用[:]
)没有什么好处,除非你想保持原来的对象不被其他引用修改。
2
如果你有想要删除的字典的引用,你可以试试这个:
self.list_cfg.remove( your_dictionary )
如果你没有它的任何引用,你就得先找到它:
for d in self.list_cfg:
if d['name']=='Some name': # or some other check to identify your dict
self.list_cfg.remove(d)
break
8
一个更好的解决办法是使用一个字典里面再嵌套一个字典,并且用id属性来作为索引。这样,即使你删除了其中一个字典,其他的id依然不会改变。