2015-04-02 2 views
0

Итак, вот проблема, я импортирую словарь с любым размером от 6000 до 12000 ключей. Затем используйте вложенный алгоритм для группировки их в список внутри другого словаря. Я использую следующий код, чтобы проверить, если ключ в словаре:Эффективное повторение словаря в Python

for key in range(sizeOfOriginalKeys): 
    if key in key_data: 

Как вы можете себе представить, это берет навсегда, так как алгоритм сортировки является довольно сложным. Я хотел бы только перебирать ключи в «key_data», не делая 1000 до 11999, если есть этот ключ в словаре. Есть ли способ сделать список текущих ключей? Затем итерации через них? Или, по крайней мере, что-то более эффективное, чем то, что я сейчас делаю?

Текущий код после того, как предложение Кевина:

for key in key_data: 
    currentKey = key_data[key].name 
    if key_data[currentKey].prefList[currentPref] == currentGroup 
     key_data[currentKey].currentScore = getDotProduct() 
     group_data[currentGroup].keyList.append(key_data[currentKey]) 
     group_data[currentGroup].sortKeys() 
     del key_data[currentKey] 

Ключевые имена являются целыми числами. В конце алгоритма сортировки я удаляю ключ, если он был отсортирован в группу. Теперь я получаю сообщение об ошибке: изменился размер словаря во время итерации.

Мысли?

+0

Вы можете показать немного больше вашего скелет алгоритма? – goncalopp

+0

Конечно, один момент. Я отредактирую свой оригинальный пост. – TheNoviceAllen

+0

Проверка ключа в dict - это операция O (1), поэтому очень дешево - возможно, есть и другие области, которые необходимо оптимизировать. Не удаляйте элемент из key_data в цикле, вы не можете изменить dict, над которым работаете. Если вам нужно знать, что вы обработали его, добавьте ключ в обработанный 'set()' – AChampion

ответ

3

Вы пытаетесь слишком трудно:

for key in key_data: 
+4

, который я мог бы буквально поцеловать вас! По юридическим причинам я не буду. – TheNoviceAllen

+0

Подождите, я просто запустил код. Таким образом, в конце алгоритма он удаляет ключ из словаря. Что вызывает ошибку: измененный размер словаря во время итерации. В любом случае? – TheNoviceAllen

+0

@ TheNoviceAllen Нет простого способа обойти это - если вы не можете отложить удаление. Если вы можете, просто поместите ключи, которые хотите удалить, в список и удалите все после 'for' – goncalopp

1

Вы можете попробовать

for key,value in key_data.items() : 
    print key 
    print value 

вы можете получить доступ к значению без вызова key_data [ключ]

+0

Вы забыли '.items()'? или, возможно, 'iteritems()'? – goncalopp

+0

opps! Извини за это – Chetchaiyan

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