从字典功能中删除键

时间:2013-11-19 18:31:34

标签: python dictionary del

我正在尝试创建一个从字典中删除字符串的void函数。

我需要确保密钥在字典中,然后该值在该特定密钥中。

这是我迄今为止所做的,但似乎存在某种困境。有什么建议吗?

def f(d, n1, n2):
    if n1 in d1 and d1[n1] == n2:
        del n2
        if d1[n1] == []:
            del n1

3 个答案:

答案 0 :(得分:3)

您正在移除n2n1本地名称,并且未触及字典。

要从字典中删除,您需要将del应用于密钥:

def f(d, n1, n2):
    if n1 in d1 and d1[n1] == n2:
        del d1[n1]

您可能想要使用一些更具描述性的名称:

def remove_item(dct, key, value):
    if key in dct and dct[key] == value:
        del dct[key]

并且,因为测试代码总是一个好主意,一个演示:

>>> demo = {'foo': 'bar', 'spam': 'ham'}
>>> def remove_item(dct, key, value):
...     if key in dct and dct[key] == value:
...         del dct[key]
... 
>>> remove_item(demo, 'monty', 'python')
>>> demo
{'spam': 'ham', 'foo': 'bar'}
>>> remove_item(demo, 'spam', 'eggs')
>>> demo
{'spam': 'ham', 'foo': 'bar'}
>>> remove_item(demo, 'spam', 'ham')
>>> demo
{'foo': 'bar'}

如果您的值是列表,并且您只需删除其中一个值,那么您需要使用list.remove(),或使用列表推导。

首先是list.remove()选项,它只删除一个值。如果重复该值,则仅删除第一个匹配项:

def remove_item(dct, key, value):
    if key in dct:
        if dct[key] == value:
            del dct[key]
        elif isinstance(dct[key], list) and value in dct[key]:
            dct[key].remove(value)

列表理解将删除值的所有副本:

def remove_item(dct, key, value):
    if key in dct:
        if dct[key] == value:
            del dct[key]
        elif isinstance(dct[key], list):
            dct[key] = [v for v in dct[key] if v != value]

list.remove()的演示:

>>> demo = {'foo': ['bar', 'baz', 'bar']}
>>> def remove_item(dct, key, value):
...     if key in dct:
...         if dct[key] == value:
...             del dct[key]
...         elif isinstance(dct[key], list) and value in dct[key]:
...             dct[key].remove(value)
... 
>>> remove_item(demo, 'foo', 'bar')
>>> demo
{'foo': ['baz', 'bar']}

列表理解的演示:

>>> demo = {'foo': ['bar', 'baz', 'bar']}
>>> def remove_item(dct, key, value):
...     if key in dct:
...         if dct[key] == value:
...             del dct[key]
...         elif isinstance(dct[key], list):
...             dct[key] = [v for v in dct[key] if v != value]
... 
>>> remove_item(demo, 'foo', 'bar')
>>> demo
{'foo': ['baz']}

答案 1 :(得分:0)

我建议使用dict.pop(key)而不是del。

你可以这样做:

def f(d, n1, n2):
    if d.has_key(n1) and d[n1] == n2:
        d.pop(n1)
    return d

答案 2 :(得分:0)

d = {'a': 1, 'b': 2}                                                            


def fun(_d, _k, _v):                                                            
    return {key: _d[key] for key in _d                                          
            if not (_k == key and _v == _d[key])}                                


print fun(d, 'b', 1)

输出:

{'a': 1, 'b': 2}