2015-11-17 2 views
0

У меня есть простой код. Существует словарь с 1500 элементами. Я хочу, чтобы удалить элементы, значения которых меньше 50.0:Удаление ключей и значений из словаря (Python 2.7)

for i in range (0, 1500): 
    if my_dict[i] < 50.0: 
     del my_dict[i] 

Я получаю сообщение об ошибке:

KeyError         Traceback (most recent call last) 
<ipython-input-16-d483c8b3ffa9> in <module>() 
     1 for i in range (0, 1500): 
----> 2  if my_dict[i] < 50.0: 
     3   del my_dict[i] 
     4 

KeyError: 0 

Что я сделал не так?

+0

В словаре нет такого ключа, как '0'. Вы, возможно, удалили его раньше или никогда не добавляли, мы не можем сказать, не видя, как вы построили 'my_dict'. –

+2

@ d6bels Непонятно, что OP хочет удалить все ключи со значениями <50, у них может быть веская причина итерации по этому диапазону. –

+0

@LevLevitsky Я вижу, что вы имеете в виду, однако, «диктатор с 1500 элементами», «диапазон (0, 1500)», и фрагмент кода заставил меня думать, что это очевидно. – d6bels

ответ

3

Как написано в комментарии от @Lev Levitsky, в словаре отсутствует хотя бы один из ключей, которые вы ищете. Вместо этого вы должны перебирать ключи словаря, например. с

for k in my_dict: 

Однако, вы не можете напрямую изменять словарные элементы размера удаляющих из него в то время как итерации по нему одновременно.

Итак, если вы хотите удалить все элементы с значениями выше 50,0

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

for k in d.keys(): 
    if d[k] < 50.0: 
     del d[k] 

Кроме того, мое предложение заключается в использовании использовать словарь понимания и создать новый словарь, исключая нежелательные элементы

new_d = {k:v for k,v in my_dict.items() if v >= 50.0} 

затем заменить оригинальный словарь и пусть сборщик мусора питона делать свою работу

my_dict = new_d 

Это последнее решение работает на любой версии питона.

Примечание: как указано в @Lev Levitsky, у вас может быть причина для итерации на подмножество ключей.

+0

Вы не можете изменить размер диктатора во время итерации, ваш первый код поднимет «RuntimeError». –

+0

@LevLevitsky спасибо. Я обновил его – Pynchia

+0

Вы можете, если вы просто перебираете 'my_dict.keys()' хотя. – SuperBiasedMan

0

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

for k,v in my_dict.items(): 
    if v < 50.0: 
     del the_dict[k] 

Это НЕ работа в Python-3.x, поскольку, my_dict.items() будет возвращать итератор ,

ИЛИ

Вы могли бы просто сделать:

my_dict = {k:v for k,v in my_dict.items() if v < 50.0} 
+0

Это не вызывает ошибки, но приводит к неправильным результатам. Вы не должны мутировать dict во время итерации над ним. –

+0

@LevLevitsky - Как так? Не могли бы вы объяснить? – JRodDynamite

+0

@LevLevitsky - внес коррективы. Обновите свой голос. – JRodDynamite

1

Как Лев отметил, вы не можете удалять ключи в то время как итерация (dict.iteritems() просто возвращает итератор на Dict, так это также не разрезает его).

В Python 2 вы можете сделать:

for k, v in mydict.items(): 
    if v < 50.0: 
     del mydict[k] 

как dict.items() возвращает список (ключ, значение) пар, а не итератора над самим Словаре

В Python 3, хотя, dict.items() возвращается объект просмотра, поэтому вы должны преобразовать его в список, подобный следующему:

for k, v in list(mydict.items()): 
    if v < 50.0: 
     del mydict[k] 
+0

Спасибо, ребята! Теперь он работает правильно :) – fremorie

+0

@ ДарьяСмирнова рада, что вы это сделали. Помните о том, чтобы повышать/отмечать как можно лучше, какие ответы помогли вам больше всего –

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