您不能dict
在迭代它时修改。您要么需要通过过滤旧的来创建新dict
的,要么创建某种临时对象来迭代:
dict
(1)用过滤后的结果新建一个:
dict1 = {k:v for (k, v) in dict1.iteritems() if all('my_string' in e for e in v)}
(2.1) 创建一个临时的dict
:
for k, v in dict1.copy():
if all('my_string' in e for e in v):
del dict1[k]
(2.2) 创建一个临时list
的key-value tuple
s:
for k, v in dict1.items():
if all('my_string' in e for e in v):
del dict1[k]
(2.3) 创建一个临时list
的密钥:
for k in dict1.keys():
if all('my_string' in e for e in dict1[k]):
del dict1[k]
那么,你如何在他们之间做出决定呢?
嗯,1 是最容易推理的,因为它具有无突变代码的所有好处。但是对于新手程序员来说,2.1-2.3 可能更简单。通常,这种区别是最重要的。
如果你担心内存使用,显然 2.3 比 2.1-2.2 更好,因为它生成的临时对象要小得多。但是 2.3 对 1 呢?这取决于两件事:首先,与仅剩余物品list
的 a 相比,所有钥匙的a 有多大?dict
其次,通过从头开始构建一个较小的哈希表而不是缩小一个较大的哈希表可以获得多少空间?通常,您不会从后者中获得任何好处,因为 Python 根本不会缩小哈希表……但如果这很重要,您需要在您的平台上使用您的用例进行测试,看看会发生什么。
如果您担心性能,它与内存使用非常相似。2.3 vs. 1 是明显的竞争者,除非你保留大部分dict
周围,否则 1 会更好——但同样,如果重要,你需要自己衡量。
最后,请注意,以上内容适用于 Python 2.7,这就是您似乎正在使用的(作为猜测)。在 3.x 中,items
两者keys
都返回现有的迭代器dict
,因此您需要明确list(dict1.items())
地list(dict1.keys())
进行复制。