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

#python #python-3.x #list #dictionary

#питон #python-3.x #Список #словарь

Вопрос:

У меня есть словарь, и в одном это ключ / значение, это значение представляет собой список. Я пытаюсь выполнить итерацию по этому dict, чтобы удалить специальные символы (это часть в порядке), но когда я получаю это значение (которое представляет собой список) Я не знаю, как это сделать.

Это мой диктат:

 {
  "id_pessoa_ies": "3",
  "cpf": "string",
  "nome": "TESTE COM Ç E ESPACO E É",
  "nome_social": "string",
  "sexo": "string",
  "data_nascimento": "26-11-2020",
  "cor_raca": "Preta",
  "estado_civil": "Test word here",
  "municipio_naturalidade": "Test again",
  "uf_naturalidade": "TEST",
  "pais_nascimento": "string",
  "docente_pessoa": [
    {
      "id_docente_ies": "string",
      "matricula": "123456789",
      "titulacao": "TEST",
      "ano_ingresso": "2020",
      "tipo_contrato": "string",
      "tipo_vinculo": "TESTE COM Ç E ESPACO E É ARROBA @ #",
      "id_unidade_lotacao": "1",
      "situacao": "ACTIVATE"
    }
  ]
}
 

Это то, что я делал до сих пор:

 for key, value in mydict.items():
       if key == 'docente_pessoa':
           # what should I do here to iterate over 'docente_pessoa' to get it's values and
           # apply my function 'text_to_it()' on it?
       else:
           text = text_to_id(value)
           mydict.items[key] = text
 

Я ценю любую помощь.

Спасибо

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

1. for docente_key, docente_val in value.items(): вы можете называть переменные как угодно. По сути, то же самое, что вы уже сделали, но с разными именами переменных. Кроме того, поскольку словари изменчивы, вы можете просто сделать val = text_to_id(val) , и это должно иметь тот же эффект.

2. Привет, @Tim, спасибо за ваш ответ. Я попробовал то, что вы сказали, и я получил : for docente_key, docente_val in value: ValueError: too many values to unpack (expected 2) . Вы знаете, что может быть?

3. Да, я обновил первый комментарий, должно быть for ... in value.items(): , у вас уже есть код, вам просто нужно сделать это снова, с другими именами переменных. Цикл внутри цикла.

Ответ №1:

Поскольку это список и dict в нем есть a, вы можете получить его следующим образом:

 docente_pessoa_dict = value[0]
 

Теперь у вас есть новый набор значений, которые вы должны изменить, я думаю, так что вы могли бы сделать это:

 for key, value in docente_pessoa_dict.items():
    # do stuff with key and value
 

итак, чтобы завершить это:

 for key, value in mydict.items():
       if key == 'docente_pessoa':
           docente_pessoa_dict = value[0]
           for key, value in docente_pessoa_dict.items():
               # do stuff with key and value
       else:
           # do stuff with key and value
 

Поскольку опубликованный код выдает a RuntimeError: dictionary changed size during iteration , потому что вы меняете значение во время итерации dict , что совершенно не связано с этим вопросом, вам нужно было бы найти способ создать дубликат ключей, а затем изменить значение.

Вы можете сделать это, просто преобразовав your dict в list , а затем изменив value :

 for key in list(mydict):
    if key == 'docente_pessoa':
        docente_pessoa_dict = mydict[key][0]
        for docente_pessoa_dict_key, docente_pessoa_dict_value in docente_pessoa_dict.items():
            text = text_to_id(docente_pessoa_dict_value)
            mydict[key][0][docente_pessoa_dict_key] = text 
    else:
        text = text_to_id(mydict[key])
        mydict[key] = text
 

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

1. Спасибо вам за вашу помощь. Я получил эту ошибку RuntimeError at xxxx dictionary changed size during iteration . Когда я добавил свой mydict для обновления значения внутри внутреннего for . Вы знаете, что может быть?

2. @GuilhermeSchults ну, это не часть вашего вопроса, но взгляните на это, и я обновлю ответ

3. Я приветствую вашу помощь. Я посмотрю на это.

4. @GuilhermeSchults вот так, я обновил ответ правильным способом сделать это, дайте мне знать, если это сработает для вас

5. @GuilhermeSchults Я просто исправил код, поскольку он не изменил значение docente_pessoa_dict_key I исправил его сейчас, и он должен делать то, что вы намеревались, если я правильно понял.