我有一本字典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]
它确实有效,但我确信有更好的方法。 (而且我不想创建另一个字典,它发生在上面的代码中,但它并不重要。)
答案 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中,keys
和dict
都返回现有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)}
这假设你不介意制作第二个字典,它是第一个字典的过滤副本。