web-dev-qa-db-fra.com

Python Math - TypeError: l'objet 'NoneType' n'est pas souscriptable

Je crée un petit programme pour les mathématiques (pas de raison particulière, je voulais plutôt) et j'ai rencontré l'erreur "TypeError: l'objet 'NoneType' n'est pas enregistrable.

Je n'ai jamais vu cette erreur, alors je n'ai aucune idée de ce que cela signifie.

import math

print("The format you should consider:")
print str("value 1a")+str(" + ")+str("value 2")+str(" = ")+str("value 3a ")+str("value 4")+str("\n")

print("Do not include the letters in the input, it automatically adds them")

v1 = input("Value 1: ")
v2 = input("Value 2: ")
v3 = input("Value 3: ")
v4 = input("Value 4: ")

lista = [v1, v3]
lista = list.sort(lista)

a = lista[1] - lista[0]

list = [v2, v4]
list = list.sort(list)

b = list[1] = list[0]

print str(a)+str("a")+str(" = ")+str(b)

L'erreur:

Traceback (most recent call last):
  File "C:/Users/Nathan/Documents/Python/New thing", line 16, in <module>
    a = lista[1] - lista[0]
TypeError: 'NoneType' object is not subscriptable
25
Nathan Abbott
lista = list.sort(lista)

Cela devrait être

lista.sort()

La méthode .sort() est en place et renvoie None. Si vous voulez quelque chose qui n’est pas sur place et qui renvoie une valeur, vous pouvez utiliser

sorted_list = sorted(lista)

A part # 1: veuillez ne pas appeler vos listes list. Cela élimine le type de liste intégré.

À part # 2: Je ne suis pas sûr de ce que cette ligne est censée faire:

print str("value 1a")+str(" + ")+str("value 2")+str(" = ")+str("value 3a ")+str("value 4")+str("\n")

est-ce simplement

print "value 1a + value 2 = value 3a value 4"

? En d'autres termes, je ne sais pas pourquoi vous appelez str des choses qui sont déjà str.

A part # 3: vous utilisez parfois print("something") (syntaxe Python 3) et parfois print "something" (Python 2). Ce dernier vous donnerait une syntaxe dans py3, vous devez donc exécuter 2. *, auquel cas vous ne voulez probablement pas prendre l'habitude ou vous allez finir d'imprimer des n-uplets, avec des parenthèses supplémentaires. J'avoue que cela fonctionnera assez bien ici, car s'il n'y a qu'un seul élément dans les parenthèses, ce n'est pas interprété comme un tuple, mais cela semble étrange à l'œil pythonique.

31
DSM

L'exception TypeError: 'NoneType' object is not subscriptable se produit car la valeur de lista est en réalité None. Vous pouvez reproduire TypeError que vous avez dans votre code si vous essayez ceci avec la ligne de commande Python:

None[0]

La raison pour laquelle lista est défini sur Aucun, c'est parce que la valeur de retour de list.sort() est None... Elle ne pas renvoie une copie triée de la liste d'origine. Comme le indique la documentation , la liste est triée sur place au lieu d'être copiée (ceci pour des raisons d'efficacité).

Si vous ne souhaitez pas modifier la version d'origine, vous pouvez utiliser

other_list = sorted(lista)
22
aculich

Comme indiqué précédemment dans l'une des réponses, cette erreur se produit lorsque la valeur de la liste s'avère être vide. Bien que ce ne soit pas tout à fait pertinent pour cette question, la même erreur s’est produite lors de la lecture d’images en utilisant opencv et numpy car le nom du fichier était différent de celui spécifié probablement ou parce que le répertoire de travail n’avait pas été spécifié correctement.

0
ashwinjoseph

Sur ce lien https://docs.python.org/2/tutorial/datastructures.html vous pouvez lire cette méthode "Trier les éléments de la liste en place", cela signifie que la valeur du résultat sera triés et le résultat sera sur lui-même. La fonction ne renvoie aucun. 

Lorsque vous attribuez le résultat à "lista" à la ligne 14 

lista = list.sort(lista)

vous définissez la zone sur None C'est l'erreur. Aucun ne possède toujours pas de données et ne peut pas être Subscriptable. "TypeError: l'objet 'NoneType' n'est pas souscriptable"

pour corriger cette erreur (pour trier la liste), faites ceci à la ligne 14:

lista.sort() # this will sort the list in line

Mais il y a d'autres erreurs: À la ligne 18 lorsque vous attribuez:

list = [v2, v4]

Vous clobez ce type intégré "liste" et vous obtiendrez l'erreur suivante:

TypeError: 'list' object is not callable

Pour corriger cela, dites:

lista2 = [v2, v4]

Toujours à la ligne 19, la même erreur que la ligne 14. Procédez comme suit pour trier l’autre liste:

lista2.sort()

À la ligne 21, vous essayez d’indexer la liste des types intégrés. Pour corriger cela:

b = lista2[1] = lista2[0]

Avec cela, votre code fonctionnera bien. Enfin tout le code correct:

import math

print("The format you should consider:")
print str("value 1a")+str(" + ")+str("value 2")+str(" = ")+str("value 3a ")+str("value 4")+str("\n")

print("Do not include the letters in the input, it automatically adds them")

v1 = input("Value 1: ")
v2 = input("Value 2: ")
v3 = input("Value 3: ")
v4 = input("Value 4: ")

lista = [v1, v3]
lista.sort()

a = lista[1] - lista[0]

lista2 = [v2, v4]
lista2.sort()

b = lista2[1] = lista2[0]

print str(a)+str("a")+str(" = ")+str(b)
0
Antonio Peixoto