Переименование ключей словаря через проблему цикла

#python-3.x #pandas #loops #dictionary

#python-3.x #pandas #циклы #словарь

Вопрос:

У меня есть столбец ‘EDU’ в моем фрейме данных, df. где я пытался создать словарь с помощью value_counts(), poe_dict . Это выглядит так.

 edu_m=df['EDU'].sort_values()
poe_dict = edu_m.value_counts(normalize=True).to_dict()
poe_dict

{4: 0.47974705779026877,
 3: 0.24588090637625154,
 2: 0.172352011241876,
 1: 0.10202002459160373}
 

Теперь я пытаюсь заменить ключи ‘4,3,2,1’ этими строками, которые я поместил в список.

n_keys=[«колледж»,»больше, чем средняя школа, но не колледж», «средняя школа»,»меньше, чем средняя школа»]

Если я выполняю каждый из них по отдельности, все работает нормально, давая мне ожидаемый результат.

 In:
   poe_dict['college'] = poe_dict.pop(4)
   poe_dict['more than high school but not college'] = poe_dict.pop(3)
   poe_dict['high school'] = poe_dict.pop(2)
   poe_dict['less than high school'] = poe_dict.pop(1)

Out:
{'college': 0.47974705779026877,
'more than high school but not college': 0.24588090637625154,
'high school': 0.172352011241876,
'less than high school': 0.10202002459160373}
 

однако, если я попытаюсь сделать это как цикл, это приведет к этому.

 In:
for key, n_key in zip(poe_dict.keys(), n_keys):
   poe_dict[n_key] = poe_dict.pop(key)
poe_dict

Out:
{2: 0.172352011241876,
1: 0.10202002459160373,
'high school': 0.47974705779026877,
'less than high school': 0.24588090637625154}

 

Итак, я не понимаю, почему цикл не работает для ключей 2 и 1?

Я также попытался отладить его, чтобы посмотреть, что происходит в подобном цикле.

 In:
for key, n_key in zip(poe_dict.keys(), n_keys):
  
   print (key,n_key)
   poe_dict[n_key] = poe_dict.pop(key)
   
Out:
4 college
3 more than high school but not college
college high school
more than high school but not college less than high school
 

Ответ №1:

Вы перебираете ключи poe_dict в цикле for . Однако ключи poe_dict изменяются при выполнении инструкции is poe_dict[n_key] = poe_dict.pop(key) . Поэтому информация о ключах становится неверной. Правильный способ — сохранить ключи peo_dict в список list(poe_dict.keys()) и перебирать этот новый список ключей.

 poe_dict = {4: 0.47, 3:0.25, 2:0.17, 1:0.10}

n_keys = ['college', 'more than high school but not college','high school', 'less than high school' ]
keylist = list(poe_dict.keys())
for key, n_key in zip(keylist, n_keys):
   print (key,n_key)
   poe_dict[n_key] = poe_dict.pop(key)
print (poe_dict)
 

Результаты будут следующими

 {'college': 0.47, 'more than high school but not college': 0.25, 'high school': 0.17, 'less than high school': 0.1}
 

Комментарии:

1. спасибо, сэр. Я не понимал, что оба они должны быть списками.