2014-07-11 3 views
0

Прошу простить меня, если он выглядит дубликат. Я использовал методы, приведенные в link 1 и link 2удалить Ключ в словаре python

Python version Я использую 2.7.3. Я передаю словарь в функцию и хочу удалить ключи, если условие истинно.

Когда я проверяю длину до и после прохождения словаря, то же самое.

Мой код:

def checkDomain(**dictArgum): 

    for key in dictArgum.keys(): 

     inn=0 
     out=0 
     hel=0 
     pred=dictArgum[key] 

     #iterate over the value i.e pred.. increase inn, out and hel values 

     if inn!=3 or out!=3 or hel!=6: 
        dictArgum.pop(key, None)# this tried 
        del dictArgum[key] ###This also doesn't remove the keys 

print "The old length is ", len(predictDict) #it prints 86 

checkDomain(**predictDict) #pass my dictionary 

print "Now the length is ", len(predictDict) #this also prints 86 

Кроме того, я прошу вас помочь мне понять, как ответить на ответы. Каждый раз, когда я не отвечаю должным образом. Разрыв строки или код записи не работают со мной. Спасибо.

+0

Что вы подразумеваете под * «понимаете, как отвечать на ответы» *? Если у вас есть вопрос о самом SO, рассмотрите http://meta.stackoverflow.com – jonrsharpe

+2

Да, вы не можете писать многострочные комментарии. Измените свой вопрос, чтобы добавить важную информацию, включая код. Но вы можете использовать backticks для 'inline monospace snippets'. –

+0

@jonrsharpe Привет, я не могу получить правильный отступ, разрывы строк в моих ответах. Я могу правильно задавать вопросы, но мне сложно ответить на комментарии. :( –

ответ

3

Это происходит потому, что словарь распакованы и перепакованная в параметр ключевого слова **dictArgum, поэтому словарь вы видите внутри функции другой объект:

>>> def demo(**kwargs): 
    print id(kwargs) 


>>> d = {"foo": "bar"} 
>>> id(d) 
50940928 
>>> demo(**d) 
50939920 # different id, different object 

Вместо передать словарь непосредственно:

def checkDomain(dictArgum): # no asterisks here 

    ... 

print "The old length is ", len(predictDict) 

checkDomain(predictDict) # or here 

или return и назначить его:

def checkDomain(**dictArgum): 

    ... 

    return dictArgum # return modified dict 

print "The old length is ", len(predictDict) 

predictDict = checkDomain(**predictDict) # assign to old name 
+0

Спасибо. Это работает отлично, как я и хотел. –

Смежные вопросы