摆脱字典中不需要的键

时间:2012-12-29 00:18:56

标签: python dictionary

我有一本字典dict1;每个值都是一个字符串列表。如果此字符串列表中的所有元素都包含'my_string',则不需要此特定键。我想出了这个:

from collections import defaultdict
dict2 = defaultdict(list)
for key, value in dict1.iteritems():
    for list_element in value:
        if 'my_string' not in list_element:
            dict2[key] = dict1[key]

它确实有效,但我确信有更好的方法。 (而且我不想创建另一个字典,它发生在上面的代码中,但它并不重要。)

3 个答案:

答案 0 :(得分:2)

for key, value in dict1.items():
    if all('my_string' in e for e in value):
        del dict1[key]

注意:注意不要使用iteritems并从同一个dict中删除。 items很好,它会复制。

答案 1 :(得分:2)

迭代时,您无法修改dict。您需要通过过滤旧的dict来创建新的dict,或者创建某种临时对象来迭代:

(1)使用筛选结果创建新的dict1 = {k:v for (k, v) in dict1.iteritems() if all('my_string' in e for e in v)}

dict

(2.1)创建一个临时for k, v in dict1.copy(): if all('my_string' in e for e in v): del dict1[k]

list

(2.2)创建临时tuple键值for k, v in dict1.items(): if all('my_string' in e for e in v): del dict1[k]

list

(2.3)创建临时for k in dict1.keys(): if all('my_string' in e for e in dict1[k]): del dict1[k] 个键:

list

那么,你们如何决定它们呢?

嗯,1是最容易推理的,因为它具有无变异代码的所有好处。但对于新手程序员来说,2.1-2.3可能更直接。通常,这种区别是最重要的区别。

如果您担心内存使用情况,显然2.3优于2.1-2.2,因为它会生成一个小得多的临时对象。但2.3 vs. 1怎么样?这取决于两件事:首先,所有密钥的dict与仅剩余项目的dict相比有多大?第二,通过从头开始构建一个较小的哈希表而不是缩小一个较大的哈希表,可以获得多少空间?通常,您不会从后者获得任何的好处,因为Python根本不会缩小哈希表...但如果它很重要,您需要在您的平台上测试您的用例,并且看看会发生什么。

如果你担心性能,它与内存使用非常相似。 2.3 vs. 1是明显的竞争者,除非你保留大部分items,否则1会更好 - 但是如果重要的话,你需要自己衡量。

最后,请注意上面的内容适用于Python 2.7,这就是你似乎正在使用的(猜测)。在3.x中,keysdict都返回现有list(dict1.items())上的迭代器,因此您需要执行list(dict1.keys())和{{1}}以使复制显式化。

答案 2 :(得分:1)

认为你可以使用字典理解,如果你的版本中有这个字典:

filtered = {k:v for k,v in d1.items() if all(e == 'my_string' for e in v)}

这假设你不介意制作第二个字典,它是第一个字典的过滤副本。