2013-11-19 2 views
-1

Я пытаюсь создать функцию void, которая удаляет строки из словаря.удалить ключ из функции словаря

Мне нужно убедиться, что ключ находится в словаре, а затем значение находится в этом конкретном ключе.

Это то, что я имею до сих пор, но, похоже, существует какая-то дилемма. Любой совет?

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

Pro совет: показать нам, что происходит, и то, что должно было произойти вместо этого. В этом случае нет сообщений об ошибках, о чем стоит сказать. –

+1

Python не имеет функций 'void'. * Все функции * в python возвращают что-то ... если вы явно не возвращаете что-то, python добавляет 'return None' к концу функции для вас. – SethMMorton

ответ

3

Вы удаляете n2 и n1 локальные имена, а не прикасаясь к словарю.

Чтобы удалить из словаря, необходимо применить 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'} 

Если ваши значения являются списками и y ou нужно удалить только одно из значений, тогда вам нужно использовать 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']} 
+0

Я могу сделать это просто отлично, но у меня проблемы, когда есть более 1 значения, связанные с ключом. Например, demo = {'x': [1,2,3]}. –

+0

@BobDarren: Тогда вам нужно указать * такие ограничения в своем вопросе. Например, вы не предоставили нам никаких образцов. –

+0

Достаточно легко попробовать, не так ли?Да, если 'value' - это список, а' dct [key] 'сам представляет собой список *, содержащий * другой список, который равен' value', тогда метод работает просто отлично. –

0

Я бы предложил использовать dict.pop (key) вместо del.

Вы могли бы сделать что-то вроде этого:

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

Это работает больше, чем 'del d [n1]' does; он возвращает, например, всплывающее значение. –

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} 
Смежные вопросы