如何从字典中删除某些项目?

时间:2019-04-18 20:39:50

标签: python dictionary

我正在尝试过滤存储在字典中的服务器的响应。 词典包含列表。我要删除列表中不包含5个项目的每个键中的每个列表。

我尝试过这样的代码

def mutate_res(dic):
    for key in dic.keys():
        for response in dic[key]:
            if len(response) != 5:
                dic[key].remove(response)
    return dic

我希望dic [value]仅具有包含5个项目的列表,但它不起作用,可能有3或5个项目

3 个答案:

答案 0 :(得分:3)

您可以删除和删除密钥:

def mutate_res(dic):
    delete_me = [ k for k in dic if len(dic[k])!=5]
    for k in delete_me:
        del dic[k] 
    return dic

这不会在迭代时删除任何内容,因此这样做是安全的。


误读了数据结构-要删除长度为!= 5的内部列表,您可以这样做:

def mutate_res(dct):
    delete_me = [ k for k in dct if any(len(inner)!=5 for inner in dct[k])]
    for k in delete_me:
        dct[k] = [inner for inner in dct[k] if len(inner) == 5]
    return dct

d = {1: [ [1,],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5]]}

print(mutate_res(d)) # {1: [[1, 2, 3, 4, 5]]}

答案 1 :(得分:2)

由于您无需在原地对字典进行变异,因此您可以使用理解并返回正确的字典。尽管在这种情况下我会考虑更改函数的名称,以免引起误解。

def mutate_res(dic):
    return {k:v for k,v in dic.items() if len(v) == 5}

d = {
    'a': [1, 2, 3, 4, 5],
    'b': [1,2],
    'c': [1, 2, 3, 4, 5, 6],
    'd': [1, 2, 3, 4, 5]
}
mutate_res(d)
>> {'a': [1, 2, 3, 4, 5], 'd': [1, 2, 3, 4, 5]}

答案 2 :(得分:1)

您可以修改代码以使用列表理解来过滤掉不需要的元素:

def mutate_res(dic):
    for key in dic.keys():
        dic[key] = [x for x in dic[key] if len(x) != 5]