GOOGLE ADS

vendredi 29 avril 2022

dictionnaire imbriqué TypeError : l'objet 'NoneType' n'est pas inscriptible

J'ai un dictionnaire - questions. la clé est un nombre et la valeur est un autre dictionnaire. voici un exemple de structure:

 questions = {
2313: {"question": "How much is 2+2", "answers": ["3", "4", "2", "1"], "correct": 2},
4122: {"question": "What is the capital of France?", "answers": ["Lion", "Marseille", "Paris", "Montpellier"],
"correct": 3}
}

J'ai besoin d'ajouter plus de questions au dictionnaire à partir d'un fichier texte ('questions.txt') où les questions ressemblent à ceci :
0#Quelle est la capitale des États-Unis ?#Washington DC#New York#Los Angeles#Detroit#1
Après avoir ouvert le fichier, j'ai créé une boucle pour parcourir toutes les questions et les ajouter au dictionnaire. J'ai utilisé une fonction de mon protocole 'chatlib':

def split_data(data, expected_fields):
splitted = data.split('#')
if len(splitted) == expected_fields:
return splitted
else:
return

ainsi, par exemple, lorsque je l'utilise sur la question avant de la renvoyer sous la forme d'une liste qui ressemble à ceci :
['0', 'Quelle est la capitale des États-Unis ?', 'Washington DC', 'New York', ' Los Angeles', 'Detroit', '1']
J'ai essayé beaucoup de façons différentes d'écrire le code principal,

 list_new_questions = open("questions.txt").read().split('\n')
for question in list_new_questions:
questionlist = chatlib.split_data(question, 7)
key = int(questionlist[0])
questions[key] = {"question": "", "answers": [], "correct": 0}
questions[key]["question"] = questionlist[1]
questions[key]["answers"] = [questionlist[2], questionlist[3], questionlist[4], questionlist[5]]
questions[key]["correct"] = int(questionlist[6])

mais chaque fois qu'il renvoie une erreur (TypeError: l'objet 'NoneType' n'est pas inscriptible) et dit que la valeur de int(questionlist[0]) est None mais je ne comprends pas pourquoi. Comment peut-il être None, il est censé être la valeur int du premier élément de la liste questionlist qui est toujours un nombre. chaque fois que j'imprime int(questionlist[0]), il imprime toujours un nombre, donc je ne comprends pas pourquoi il dit que c'est None.


Solution du problème

lorsque vous revenez de la ligne 3,
questionlist = chatlib.split_data(question, 7)votre fonction peut revenir Nonesi le len(splitted)` n'est pas == à 7.

donc questionlist = Nonequand il n'y a pas 7 champs et puis à la ligne 4 vous essayez de prendre l'index 0 de None.

une solution et une restructuration faciles ressembleraient à :

def split_data(data):
# validate data here
splitted = data.split("#")
# validate splitted here if you need to
return splitted
list_new_questions = open("questions.txt").read().split("\n")
for question in list_new_questions:
questionlist = chatlib.split_data(question)
# do your validation here
if len(questionlist) == 7:
# try except maybe if you are unsure about the data split you get
key = int(questionlist[0])
questions[key] = {
"question": questionlist[1],
"answers": questionlist[2:6],
"correct": int(questionlist[6)
}
else:
print("Invalid question format")

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique ?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...