0

我有一本字典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]

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

4

3 回答 3

2

您不能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 tuples:

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())进行复制。

于 2012-12-29T00:31:57.150 回答
2
for key, value in dict1.items():
    if all('my_string' in e for e in value):
        del dict1[key]

注意:注意不要iteritems从同一个字典中使用和删除。items很好,它可以复制。

于 2012-12-29T00:23:52.743 回答
1

认为您可以只使用字典理解,如果您的版本中可用的话:

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

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

于 2012-12-29T01:03:03.200 回答