-4

このコードについて助けが必要です。ターミナルで実行すると、次のようになります。

<__main__.Polynomial instance at 0x2b6ae51c80e0>
<__main__.Polynomial instance at 0x2b6ae51c84d0>
Traceback (most recent call last):
  File "Polynomial_dict1.py", line 36, in <module>
    print p+p2
  File "Polynomial_dict1.py", line 22, in __add__
    result_d[key] = other.d[:]
TypeError: unhashable type

何が悪いのかわかりません。コードは次のとおりです。

from Polynomial import*
class Polynomial:
    def __init__(self, dictionary):
        self.d = dictionary


    def __call__(self, x):
        s = 0

        for key in d.keys:
            s += self.d[key]*x**key
        return s

    def __add__(self, other):
        if len(self.d)>len(other.d):
            result_d = self.d[:]        # copy
            for key in d.keys:
                result_d[key] += other.get(key,0)
        else:
            result_d = other.d[:]
            for key in d.keys:
                result_d[key] += self.d.get[key,0]
        return Polynomial(result_d)     


p = Polynomial({1:1,100:-3})
p2 = Polynomial({1:-1,20:1,100:4})

print p 
print p2
print p+p2
4

3 に答える 3

3

私が知る限り、辞書 ( self.d[:]) でスライス構文を使用しようとしています。それはうまくいきません。コピーを作成するには、 が必要ですself.d.copy()


次の行でもエラーが発生します。

result_d[key] += self.d.get[key,0]

そのはず:

result_d[key] += self.d.get(key,0)

また、

for key in d.keys:

keysメソッドであるため機能しません-- 呼び出す必要があります:

for key in self.d.keys():
于 2012-11-02T19:11:15.087 に答える
2

彼がしようとしていることは次のとおりだと思います。

彼は、多項式を追加できるプログラムを作成したいと考えています。多項式の係数と累乗は、辞書としてプログラムに実装されます。

p = Polynomial({1:1, 100:-3})
p2= Polynomial({1:-1, 20:1, 100:4})

キーはパワーで、値はそのパワーの係数です。

p と p2 は数学的な形式で次のようになります。

x - 3x* 100 {1:1, 100:-3} および x *20 - x + 4x**100 {1:-1, 20:1, 100:4}

print ステートメントは次のようになります: x* 20+x *100

ただし、 addメソッドをどのように呼び出すか、または 2 つのインスタンスを追加するときに自動的に行われるかについて興味がありますか?

上記の print ステートメントを実行すると、次のようになるためです。

Terminal > python stack_overflow.py 
    <__main__.Polynomial instance at 0x7f6879fffd88>
    <__main__.Polynomial instance at 0x7f6879fffe18>
    <__main__.Polynomial instance at 0x7f6879fffe60>
于 2012-11-04T10:43:58.097 に答える
0

これは、すべての構文の問題を取り除き、コードをエラーなしで実行するコードのバージョンですが、あなたがやろうとしていたことが本当に必要かどうかはわかりません.

from Polynomial import*
class Polynomial:
    def __init__(self, dictionary):
        self.d = dictionary

    def __call__(self, x):
        s = 0
        for key in d.keys():
            s += self.d[key] * x**key
        return s

    def __add__(self, other):
        if len(self.d)>len(other.d):
            result_d = self.copy()
            for key in self.d:
                result_d[key] += other.get(key, 0)
        else:
            result_d = other.d.copy()
            for key in other.d:
                result_d[key] += self.d.get(key, 0)

        return Polynomial(result_d)

p = Polynomial({1:1, 100:-3})
p2 = Polynomial({1:-1, 20:1, 100:4})

print p
print p2
print p+p2

修正/変更されたすべてのリストは次のとおりです:

result_d = self.d[:]--> result_d = self.d.copy()
result_d = other.d[:]-->result_d = other.d.copy()

他の場所では、ステートメントを次のように変更for key in d.keys:しましたfor key in d:
(ただし、機能しfor key in d,keys():ていたはずです)。

result_d[key] += self.d.get[key,0]
代わりに持っていた1行でresult_d[key] += self.d.get(key,0)

私はそれを残しましたがfrom Polynomial import*、スクリプトがそれ自体をインポートし、基本的に2回実行されるため、おそらく最初も間違いです。

ここに質問を投稿する前に、コードから構文エラーを取り除くようにしてください (それができず、それがあなたの質問でない限り)。

于 2012-11-03T00:45:08.790 に答える