2013-08-02 4 views
-2

У меня есть объект под названием result. result.f представляет собой словарь в виде (в качестве примера):Как удалить 0s из словаря в python

{('a','a'):9, ('a','b'):10, ('a','c'):0} 

Я хочу, чтобы удалить элементы, которые равны 0 из словаря result.f. Я написал следующий код:

new_f=set() 
for j in result.f.keys(): 
    if result.f[j]!=0: 
     new_f.append(j:result.f[j]) 

Но у меня есть ошибка синтаксиса:

new_f.append(j:result.f[j]) 
       ^
SyntaxError: invalid syntax 

Как я могу написать новый словарь в new_f таким образом, что new_f равно result.f после удаления элементов, которые равны 0?

UPDATE: Если в словаре: {('a','a'):9, ('a','b'):10, ('a','c'):0} Я хочу выход быть такой же, как и предыдущий, но без 0 пункта: {('a','a'):9, ('a','b'):10}

+0

Во-первых, обратите внимание, что new_f представляет собой набор, и множества не имеют какого-либо метода '' на добавление. Во-вторых, что означает «j: result.f [j], который должен означать? Что вы пытаетесь сделать с двоеточием? –

+0

j - это ключ, а result.f [j] - значение. Поэтому я хочу создать новый словарь как: key: value. Например: '{('a', 'a'): 9}' потому что, если я не добавил 'j:', приведенный набор будет содержать значения без ключей. – user2192774

+0

As почему ваша первоначальная попытка не сработала, 'new_f' был' set', а не 'dict', и чтобы добавить новые ключи, которые вы хотели бы использовать new_f [j] = result.f [j]'. '. append' - это только метод 'lists'. – SethMMorton

ответ

2

Как о:

new_f = dict((k,v) for (k,v) in result.f.iteritems() if v != 0) 

Или более подробно описано в форме OP:

new_f=dict() 
for j in result.f.keys(): 
    if result.f[j]!=0: 
     new_f[j] = result.f[j] 
+0

+1. Это, вероятно, самый короткий способ сделать это. К сожалению, items() может быть очень медленный, если есть много словарных статей, поскольку он по существу делает копию всего словаря в памяти. – misha

+0

Это сделало эту работу. Thanx. – user2192774

+2

В dict-comprehen sion '{k: v для k, v в result.iteritems(), если v! = 0}' (требуется Py 2.7.x). – neuront

3

Использование списка понимание:

for key in [k for k in d if d[k] == 0]: 
    d.pop(key) 
+2

'd.pop (k)' может быть более идиоматичным – inspectorG4dget

0

попробовать это

mydict = {('a','a'):9, ('a','b'):10, ('a','c'):0} 
for i in filter(lambda x: mydict[x] == 0, mydict): 
    del mydict[i] 
print mydict 
Смежные вопросы