我必须设计并实现一个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”
的项目分配
任何帮助或建议?非常感谢你!
答案 0 :(得分:3)
这里有很多问题,我会尝试逐一介绍它们
dict = {}
这不仅会覆盖python的dict ,(参见mgilson的评论),但这是项目的错误数据结构。您应该使用列表(如果您有唯一的无序值,则使用集合)
数据结构是一个实例变量,需要使用self
并在__init__
函数内定义。你应该使用这样的东西:
class TwoSum(object):
def __init__(self):
self.numbers = []
def add(self,n):
dict[n] = n
将项目分配给dictionairy不是这样做的方法。您应该添加到您的列表中。此外,您需要使用self.variableName = value
这个范围是错误的,你需要一个嵌套范围,或者是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
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))