Как обойти необходимость обновления словаря - PullRequest
3 голосов
/ 03 апреля 2009

Мне нужно удалить пару k / v из словаря в цикле. После получения RuntimeError: dictionary changed size during iteration я удалил словарь после удаления k / v, и в одном из внешних циклов я пытаюсь открыть вновь выбранный / обновленный словарь. Однако, как многие из вас, вероятно, знают - я получаю ту же ошибку - я думаю, когда она достигает вершины цикла. Я не использую свой словарь в самом внешнем цикле.

Так что мой вопрос - кто-нибудь знает, как обойти эту проблему? Я хочу удалить пару k / V из словаря и использовать этот словарь с измененным размером на следующей итерации цикла.

чтобы сфокусировать проблему и использовать решение от Cygil

list=[27,29,23,30,3,5,40]
testDict={}
for x in range(25):
    tempDict={}
    tempDict['xsquared']=x*x
    tempDict['xinverse']=1.0/(x+1.0)
    testDict[(x,x+1)]=tempDict

for item in list:
    print 'the Dictionary now has',len(testDict.keys()), ' keys'
    for key in testDict.keys():
        if key[0]==item:

        del testDict[key]

Я делаю это, потому что мне нужно, чтобы некоторые научные сотрудники сравнивали некоторые наблюдения из двух наборов данных, которые не могли быть сопоставлены из-за вариантов имен. Идея состоит в том, чтобы выбросить имя из одного набора данных (скажем, из набора A), а затем на основе совпадения ключей найти все имена, связанные с этим ключом, в другом наборе данных (набор B). В одном совпадении я не хочу показывать значение из B снова, чтобы ускорить процесс для них. Поскольку есть 6000 наблюдений, я также не хочу, чтобы они начинались с начала А каждый раз, когда они возвращаются к работе. Тем не менее, я могу исправить это, позволив им выбрать последний ключ от A, с которым они работали. Но мне действительно нужно уменьшить B, как только будет определено совпадение

Ответы [ 3 ]

6 голосов
/ 03 апреля 2009

Без кода, я предполагаю, что вы пишете что-то вроде:

for key in dict:
    if check_condition(dict[key]):
       del dict[key]

Если это так, вы можете написать

for key in list(dict.keys()):
    if key in dict and check_condition(dict[key]):
        del dict[key]

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

4 голосов
/ 03 апреля 2009

Удалить все ключи, значение которых> 15:

for k in mydict.keys(): # makes a list of the keys and iterate
                        # over the list, not over the dict.
    if mydict[k] > 15:
        del mydict[k]
1 голос
/ 03 апреля 2009

Изменение:

for ansSeries in notmatched:

Кому:

for ansSeries in notmatched.copy():
...