Python TypeError:'type'对象不支持项目赋值

时间:2016-06-10 23:01:22

标签: python

我必须设计并实现一个TwoSum类。它应该支持以下操作:

  • add - 将数字添加到内部数据结构中。
  • find - 查找是否存在总和等于该值的任何数字对。

这是我的代码:

class TwoSum(object):

    dict = {}

    def add(self,n):
        dict[n] = n #TypeError: 'type' object does not support item assignment

    def find(self,n):
        for i in range(0,len(dict)+1):
            if dict[i] == None:
                continue

            val = n - dict[i]
            if dict[val] != None and val != i+1:
                return True
        return False

test = TwoSum()
test.add(1)
test.add(3)
test.add(5)
print(test.find(4))  # True
print(test.find(7))  # False

我收到了错误消息

  

TypeError:'type'对象不支持“dict [n] = n”

的项目分配

任何帮助或建议?非常感谢你!

4 个答案:

答案 0 :(得分:3)

这里有很多问题,我会尝试逐一介绍它们

数据结构

dict = {}

这不仅会覆盖python的dict ,(参见mgilson的评论),但这是项目的错误数据结构。您应该使用列表(如果您有唯一的无序值,则使用集合)

使用数据结构

数据结构是一个实例变量,需要使用self并在__init__函数内定义。你应该使用这样的东西:

class TwoSum(object):
    def __init__(self):
        self.numbers = []

def add

def add(self,n):
        dict[n] = n

将项目分配给dictionairy不是这样做的方法。您应该添加到您的列表中。此外,您需要使用self.variableName = value

附加到该实例的列表

def find

这个范围是错误的,你需要一个嵌套范围,或者是itertools.combinations,因为你必须检查任何两个总和为某个值的数字,pythons sum()在这里很方便。

要遍历数字,您可以使用两个范围或itertools.combinations

代码

import itertools

class TwoSum(object):
    def __init__(self):
        self.numbers = []

    def add(self, num):
        self.numbers.append(num)

    def find(self, desiredSum):
        for nums in itertools.combinations(self.numbers, 2):
            if sum(nums) == desiredSum:
                return True
        return False


test = TwoSum()
test.add(1)
test.add(3)
test.add(5)
print(test.find(4))
print(test.find(7))
#True
#False

在没有itertools的情况下查找

def find(self, desiredSum):
        for num1 in self.numbers:
            for num2 in self.numbers:
                if num1 + num2 == desiredSum and num1 != num2:
                    return True
        return False

答案 1 :(得分:1)

班级dict和方法中的dict不同

在方法中,dict是内置python类型。如果您想修改课程中的dict,可以尝试type(self).dict[n] = n

之类的内容

另外,对于它的价值,如果您的dict总是具有值==键,您可能需要考虑使用set

最后,您可能最好将dict定义为实例属性而不是类属性:

class TwoSum(object):
    def __init__(self):
        self.added_items = set()  # Make the `dict` -> `set` swap here too...
    def add(self, n):
        self.added_items.add(n)

答案 2 :(得分:1)

class TwoSum(object):
    def __init__(self):
        self.__data = []

    def __repr__(self):
        return repr(self.__data)

    def add(self, n):
        self.__data.append(n)

    def find(self, n):
        for i, v in enumerate(self.__data):
            for x, v2 in enumerate(self.__data):
                if i!= x and v + v2 == n:
                    return True
        return False

答案 3 :(得分:1)

  

这是我的解决方案,也是任何潜在人士的另一个参考   谁可能会看到这个问题。基本上,我将以上所有答案结合起来   得到这个解决方案致@Keatinge,@ mgilson,@ TheLazyScripter。   谢谢大家。

class TwoSum(object):
    def __init__(self):
        self.added_items = set()  # Make the `dict` -> `set` swap here too...
    def add(self, n):
        self.added_items.add(n)
    def find(self, n):
        for nums in itertools.combinations(self.added_items, 2):
            if sum(nums) == n:
                return True
        return False

test = TwoSum()
test.add(1)
test.add(3)
test.add(5)
print(test.find(4))
print(test.find(7))