Как обойти необходимость обновления словаря
-
23-08-2019 - |
Вопрос
Мне нужно удалить пару 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).Если было обнаружено совпадение a, я не хочу снова показывать значение из B, чтобы ускорить процесс для них.Поскольку существует 6000 наблюдений, я также не хочу, чтобы им приходилось начинать с начала A каждый раз, когда они возвращаются к работе.Однако я могу исправить это, разрешив им ввести последний ключ из A, с которым они работали.Но мне действительно нужно уменьшить B, как только совпадение будет определено
Решение
Без кода, я предполагаю, что вы пишете что-то вроде:
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())
возвращает копию ключей, а не представление, что позволяет удалять из словаря (в данном случае вы выполняете итерацию по копии ключей, а не по ключам в самом словаре).
Другие советы
Удалите все ключи, значение которых равно > 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]
Изменение:
for ansSeries in notmatched:
Для:
for ansSeries in notmatched.copy():