web-dev-qa-db-ja.com

Python Math-TypeError: 'NoneType'オブジェクトは添え字付きではありません

私は数学のための小さなプログラムを作成しています(特別な理由はありませんが、ちょっとしたかっただけです)。「TypeError: 'NoneType' object is not subscriptable。

私はこのエラーを見たことがないので、その意味がわかりません。

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)

エラー:

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
44
Nathan Abbott
lista = list.sort(lista)

これは

lista.sort()

.sort()メソッドはインプレースであり、Noneを返します。値を返すインプレースでないものが必要な場合は、使用できます

sorted_list = sorted(lista)

#1は別として、リストをlistと呼ばないでください。それは組み込みリスト型を破壊します。

余談#2:この行が何をするのかわからない:

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

単純にですか

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

?言い換えれば、すでにstrであるものに対してstrを呼び出している理由がわかりません。

#3は別として:print("something")(Python 3構文)を使用する場合と、print "something"(Python 2)を使用する場合があります。後者の場合、py3でSyntaxErrorが発生するため、2。*を実行する必要があります。この場合、習慣を付けたくないか、余分な括弧を付けてタプルを印刷することになります。括弧内に要素が1つしかない場合、それはタプルとして解釈されないため、ここでは十分に機能することを認めますが、Pythonの目には奇妙に見えます。

42
DSM

例外TypeError: 'NoneType' object is not subscriptableは、listaの値が実際にNoneであるために発生します。 Pythonコマンドラインでこれを試すと、コードで取得したTypeErrorを再現できます。

None[0]

listaがNoneに設定される理由は、list.sort()の戻り値がNoneであるためです...ソートされたnot元のリストのコピー。代わりに、 ドキュメントが指摘している のように、リストはコピーが作成される代わりにin-placeでソートされます(これは効率の理由)。

元のバージョンを変更したくない場合は、使用できます

other_list = sorted(lista)
25
aculich

前に回答の1つで述べたように、このエラーはリストの値が空であることが判明したときに発生します。この質問には完全には関係ありませんが、opencvとnumpyを使用して画像を読み取るときに同じエラーが発生しました。ファイル名がおそらく指定されたものと異なるか、作業ディレクトリが適切に指定されていないためです。

0
ashwinjoseph

このリンクで https://docs.python.org/2/tutorial/datastructures.html このメソッドを読むことができます「リストのアイテムを所定の位置に並べ替える」これは結果の値がオンになることを意味しますソートされ、結果はそれ自体になります。関数はNoneを返します。

結果を14行目の「lista」に割り当てた場合

lista = list.sort(lista)

なしに設定します。それがエラーです。 Noneは常にデータを持たず、添え字付けできません。 「TypeError: 'NoneType'オブジェクトは添え字付けできません」

(リストをソートするために)このエラーを修正するには、14行目でこれを行います。

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

ただし、他にもいくつかのエラーがあります。割り当て時の18行目:

list = [v2, v4]

この組み込み型「リスト」をクローブすると、次のエラーが表示されます。

TypeError: 'list' object is not callable

これを修正するには、次のように言います。

lista2 = [v2, v4]

19行目も14行目と同じエラーです。これを実行して、他のリストをソートします。

lista2.sort()

21行目では、組み込み型リストのインデックスを作成しようとしています。これを修正するには:

b = lista2[1] = lista2[0]

これにより、コードが正常に実行されます。最後に正しいコード全体:

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