Python 清除字典中不需要的键
我有一本字典;每个值都是字符串列表。如果此字符串列表中的所有元素都包含Python 清除字典中不需要的键,python,dictionary,Python,Dictionary,我有一本字典;每个值都是字符串列表。如果此字符串列表中的所有元素都包含'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:
'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]
这确实有效,但我相信有更好的方法。(我不希望创建另一个字典,这在上面的代码中发生,但这并不重要。)
注意:注意不要使用iteritems
,也不要从同一个目录中删除。项目
可以,它是一个副本
注意:小心不要使用
iteritems
并从同一个目录中删除。项目
可以,它是一个副本。您不能在迭代时修改目录
。您需要通过过滤旧的dict
来创建新的dict,或者创建某种临时对象来迭代:
(1) 使用过滤结果创建一个新的dict
:
dict1 = {k:v for (k, v) in dict1.iteritems() if all('my_string' in e for e in v)}
(2.1)创建一个临时的目录
:
for k, v in dict1.copy():
if all('my_string' in e for e in v):
del dict1[k]
(2.2)创建键值元组的临时列表
:
for k, v in dict1.items():
if all('my_string' in e for e in v):
del dict1[k]
(2.3)创建密钥的临时列表
:
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呢?这取决于两件事:首先,你所有的钥匙的列表
与你剩下的物品的目录
相比有多大?第二,从头构建一个较小的哈希表而不是缩小一个较大的哈希表可以获得多少空间?通常,您不会从后者中得到任何好处,因为Python根本不会收缩哈希表……但如果这很重要,您需要在您的平台上测试用例,看看会发生什么
如果您担心性能,这与内存使用非常相似。2.3和1是明显的竞争者,1会更好,除非你保留大部分的指令,但如果重要的话,你需要自己测量
最后,请注意,以上内容是针对Python2.7的,您似乎正在使用它(作为猜测)。在3.x中,items
和keys
都在现有的dict
上返回迭代器,因此需要执行list(dict1.items())
和list(dict1.keys())
以使复制显式化。在对dict进行迭代时,不能修改dict
。您需要通过过滤旧的dict
来创建新的dict,或者创建某种临时对象来迭代:
(1) 使用过滤结果创建一个新的dict
:
dict1 = {k:v for (k, v) in dict1.iteritems() if all('my_string' in e for e in v)}
(2.1)创建一个临时的目录
:
for k, v in dict1.copy():
if all('my_string' in e for e in v):
del dict1[k]
(2.2)创建键值元组的临时列表
:
for k, v in dict1.items():
if all('my_string' in e for e in v):
del dict1[k]
(2.3)创建密钥的临时列表
:
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呢?这取决于两件事:首先,你所有的钥匙的列表
与你剩下的物品的目录
相比有多大?第二,从头构建一个较小的哈希表而不是缩小一个较大的哈希表可以获得多少空间?通常,您不会从后者中得到任何好处,因为Python根本不会收缩哈希表……但如果这很重要,您需要在您的平台上测试用例,看看会发生什么
如果您担心性能,这与内存使用非常相似。2.3和1是明显的竞争者,1会更好,除非你保留大部分的指令,但如果重要的话,你需要自己测量
最后,请注意,以上内容是针对Python2.7的,您似乎正在使用它(作为猜测)。在3.x中,items
和keys
都在现有的dict
上返回迭代器,因此您需要执行list(dict1.items())
和list(dict1.keys())
以使复制显式化。我认为您可以使用字典理解,如果您的版本中有:
filtered = {k:v for k,v in d1.items() if all(e == 'my_string' for e in v)}
这假设您不介意制作第二本字典,它是第一本字典的过滤副本。我认为您可以使用字典理解,如果您的版本中有:
filtered = {k:v for k,v in d1.items() if all(e == 'my_string' for e in v)}
这假设您不介意制作第二本词典,它是第一本词典的过滤副本。应该是all
,而不是any
,我认为。应该是all
,而不是any
。