Вопрос

Мне нужно удалить пару 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():
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top