Python过滤器defaultdict

时间:2015-07-21 00:16:52

标签: python filter defaultdict

我有一个列表的默认值,但我想基本上这样做:

myDefaultDict = filter(lambda k: len(k)>1, myDefaultDict)

除了它似乎只适用于列表。我该怎么办?

3 个答案:

答案 0 :(得分:5)

您是否尝试仅使用len>获取值? 1?

字典理解是处理这个问题的好方法:

reduced_d = {k: v for k, v in myDefaultDict.items() if len(v) > 1}

正如martineau所指出的,这并没有为您提供源defaultdict的相同myDefaultDict功能。你可以在defaultdict instantiaion上使用dict理解,因为martineau显示得到相同的defaultdict功能。

from collections import defaultdict

myDefaultDict = defaultdict(list, {'ab': [1,2,3], 'c': [4], 'def': [5,6]})  # original 
reduced_d = defaultdict(list, {k: v for k, v in myDefaultDict.items() if len(v) > 1})

答案 1 :(得分:2)

我不确定您是否要删除长于1的键或值。

假设它是密钥的长度,这里有如何使用过滤器:

from collections import defaultdict

# create test data
my_defaultdict = defaultdict(list, {'ab': [1,2,3], 'c': [4], 'def': [5,6]})

my_defaultdict = defaultdict(my_defaultdict.default_factory,
                             filter(lambda i: len(i[0])>1, my_defaultdict.items()))

print(my_defaultdict)

输出:

defaultdict(<type 'list'>, {'ab': [1, 2, 3], 'def': [5, 6]})

如果它是关联值的长度,只需将len(i[0])更改为len(i[1])

答案 2 :(得分:0)

您可以使用过滤器,然后使用map根据过滤条件删除每个dict条目:

>>> example={'l1':[1], 'l2':[2,3], 'l3':[4,5,6], 'l4':[7]}
>>> filter(lambda k: len(example[k])<2, example)
['l4', 'l1']
>>> map(example.__delitem__, filter(lambda k: len(example[k])<2, example))
[None, None]
>>> example
{'l2': [2, 3], 'l3': [4, 5, 6]}