-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}

并且打印语句应产生以下内容: x* 20+x *100

我很好奇您将如何调用add方法,还是在添加 2 个实例时自动完成?

因为上面提到的打印语句在运行时给出了这个:

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]
而不是result_d[key] += self.d.get(key,0)

我把它留在了,但一from Polynomial import*开始可能也是一个错误,因为它会导致脚本自行导入并基本上运行两次。

在此处发布问题之前,您确实应该尝试从代码中获取语法错误(除非您不能,这是您的问题)。

于 2012-11-03T00:45:08.790 回答