-1

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

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

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

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

3 回答 3

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']}
于 2013-11-19T18:34:02.270 回答
0

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

你可以这样做:

def f(d, n1, n2):
    if d.has_key(n1) and d[n1] == n2:
        d.pop(n1)
    return d
于 2013-11-19T18:41:39.153 回答
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}
于 2013-11-19T18:56:47.253 回答