2013-12-06 3 views
3

Итак, я должен избавиться от всех записей, имеющих отрицательное значение. Я не понимаю, почему мой код не работает.удалить запись из словаря (Python)

def main(): 
dic = {'aa': 20, 'bb': -10, 'cc': -12} 
for i in dic: 
    if dic[i]<0: 
     del dic[i] 

print(dic) 

main() 
+0

Вы не можете удалить запись в этом цикле. Вы можете сохранить их в списке или что-то еще. – MarshalSHI

+0

Но как это помогает мне избавиться от этих записей из словаря? – spidertothefly127

ответ

4

Это должно работать в Python 2.x - подставляя цикл с

for i in dic.keys(): 
    if dic[i]<0: 
    del dic[i] 

Причина, почему это не работает в Python 3.x является то, что keys возвращает итератор вместо список-- Я нашел объяснение в https://stackoverflow.com/a/11941855/2314737

Довольно тонкое различие - я этого не знал.

Так, в Python 3.x вам нужно будет использовать

for i in list(dic): 
+0

Одинаковая проблема :( – spidertothefly127

+0

Вы проверили свой отступ? – user2314737

1
delete_list = [] 
for i in dic: 
    if dic[i] < 0: 
     delete_list.append(i) 
for each in delete_list: 
    del dic[each] 
+0

Большое спасибо. Это действительно работает – spidertothefly127

+0

привет. Просто не удаляйте элемент в списке, когда вы запускаете цикл этого списка. – MarshalSHI

+0

На мой взгляд, решение последней строки пользователя2314737 с 'list (dic)' чище в смысле удобочитаемости.Кроме того, копирование желаемых предметов в другой dict, как показано Steinar Lina, хорошо, потому что он петляет только один раз через словарь. Я предлагаю измерить все три решения, чтобы узнать, что является лучшим :) – pepr

5

Вы можете сделать это с помощью Dict постижений.

dic = {k: v for (k, v) in dic.items() if v >= 0} 
+1

+1, но должен быть 'dic.items()' вместо 'dic.values ​​()'. Кроме того, нет необходимости в круглых скобках вокруг 'k' и' v' в 'for (k, v) ...'. – pepr

+0

@pepr Конечно .. :) –

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