删除字典中的元素

时间:2013-12-01 00:40:15

标签: python list dictionary

dict = {'name': ['bob', 'bob, 'james', 'jeff'], 'last': ['bob', 'jeff', 'smith', 'jones']}

如果列表中的元素等于指定的值,则保留该元素,否则 如果它不等于指定值,则在每个键中删除该索引处的该元素。 不使用导入

例如:

>>> dict = {'name': ['bob', 'bob', 'james', 'jeff'], 'last': ['bob', 'jeff', 'smith', 'jones']}
>>> process_dict(dict, 'name', 'bob')
dict = {'name': ['bob', 'bob'], 'last': ['bob', 'jeff']}

>>> dict = {'name': ['bob', 'bob', 'james', 'jeff'], 'last': ['bob', 'jeff', 'smith', 'jones']}
>>> process_dict(dict, 'name', 'jeff')
dict = {'name': ['jeff'], 'last': ['jones']}

process_dict(dict, key, value):
    pass


>>> dict = {'name': ['bob', 'bob', 'james', 'jeff'], 'last': ['bob', 'jeff', 'smith', 'jones']}
>>> process_dict(dict, 'name', 'bob')

指定的键是'name',指定的值是'bob',所以我们看一下键,'name'遍历值 并查看元素是否等于指定值(如果是),而不是继续到下一个键,如果不是 删除每个键中该索引处的值

所以,

'name'中的第一个元素是'bob'它等于指定值,所以我们跳过它,下一个元素也是'bob' 所以我们跳过它,之后的下一个元素不等于指定值,所以我们删除了该索引处每个键中的每个元素,

我们现在得到:

{'name': ['bob', 'bob', 'jeff'], 'last': ['bob', 'jeff', 'jones']}

之后的下一个元素是'jeff',它也不等于指定值,所以我们删除该索引处每个键中的每个元素,我们 现在终于得到:

{'name': ['bob', 'bob'], 'last': ['bob', 'jeff']}

我不确定如何开始这样做,所以我需要帮助

2 个答案:

答案 0 :(得分:2)

构建一组匹配的索引(使用enumerate()生成,然后在生成新词典时选择这些索引:

def process_dict(dct, key, value):
    indices = [i for i, v in enumerate(dct[key]) if v == value]
    return {key: [value[i] for i in indices] for key, value in dct.items()}

演示:

>>> def process_dict(dct, key, value):
...     indices = [i for i, v in enumerate(dct[key]) if v == value]
...     return {key: [value[i] for i in indices] for key, value in dct.items()}
... 
>>> example1 = {'name': ['bob', 'bob', 'james', 'jeff'], 'last': ['bob', 'jeff', 'smith', 'jones']}
>>> process_dict(example1, 'name', 'bob')
{'last': ['bob', 'jeff'], 'name': ['bob', 'bob']}
>>> example2 = {'name': ['bob', 'bob', 'james', 'jeff'], 'last': ['bob', 'jeff', 'smith', 'jones']}
>>> process_dict(example2, 'name', 'jeff')
{'last': ['jones'], 'name': ['jeff']}

答案 1 :(得分:2)

使用enumerate获取找到匹配项的索引列表,然后迭代dict.items()并过滤掉那些不在这些索引中的项目。

def process_dict(d, k, v):
     indexes = [i for i, x in enumerate(d[k]) if x==v] #indexes where a match is found
     return {k:[v[i] for i in indexes] for k, v in d.items()}
... 
>>> d = {'name': ['bob', 'bob', 'james', 'jeff'], 'last': ['bob', 'jeff', 'smith', 'jones']}
>>> process_dict(d, 'name', 'bob')
{'last': ['bob', 'jeff'], 'name': ['bob', 'bob']}