我有一个字典的列表,其中一些值是空的:
d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}
在创建这些列表的最后,我想在返回字典之前删除这些空列表。我试着这样做:
for i in d:
if not d[i]:
d.pop(i)
但是我得到了一个RuntimeError。我知道你不能在字典中添加/删除元素,而迭代它…那有什么解决办法呢?
请参阅在迭代Python字典时修改它,以了解这会导致问题的引用以及原因。
我有一个字典的列表,其中一些值是空的:
d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}
在创建这些列表的最后,我想在返回字典之前删除这些空列表。我试着这样做:
for i in d:
if not d[i]:
d.pop(i)
但是我得到了一个RuntimeError。我知道你不能在字典中添加/删除元素,而迭代它…那有什么解决办法呢?
请参阅在迭代Python字典时修改它,以了解这会导致问题的引用以及原因。
当前回答
在Python 3中。X和2。X你可以使用使用列表强制复制键:
for i in list(d):
在Python 2中。X调用键复制了你可以在修改dict时迭代的键:
for i in d.keys():
但请注意,在Python 3中。第二种方法对你的错误没有帮助,因为keys返回一个视图对象,而不是将键复制到列表中。
其他回答
在Python 3中。X和2。X你可以使用使用列表强制复制键:
for i in list(d):
在Python 2中。X调用键复制了你可以在修改dict时迭代的键:
for i in d.keys():
但请注意,在Python 3中。第二种方法对你的错误没有帮助,因为keys返回一个视图对象,而不是将键复制到列表中。
如果字典中的值也是唯一的,那么我使用这个解决方案:
keyToBeDeleted = None
for k, v in mydict.items():
if(v == match):
keyToBeDeleted = k
break
mydict.pop(keyToBeDeleted, None)
Python 3不允许在迭代(使用上面的for循环)字典时删除。有各种各样的替代方案;一个简单的方法就是换线
for i in x.keys():
with
for i in list(x)
对于Python 3:
{k:v for k,v in d.items() if v}
对于这种情况,我喜欢在修改原始字典的同时进行深度复制并循环遍历该副本。
如果查找字段位于列表中,则可以在列表的for循环中进行枚举,然后将位置指定为索引,以便在原始字典中访问该字段。