Python 3.x 如何将堆栈中的所有数字相乘
尝试将堆栈中的所有数字相乘时,我最初考虑将所有元素放入一个列表,然后相乘,但不确定如何/如果这是正确的 这是我当前的代码,但我得到: TypeError:“方法”对象不能解释为整数 我也做了一个测试用例Python 3.x 如何将堆栈中的所有数字相乘,python-3.x,stack,Python 3.x,Stack,尝试将堆栈中的所有数字相乘时,我最初考虑将所有元素放入一个列表,然后相乘,但不确定如何/如果这是正确的 这是我当前的代码,但我得到: TypeError:“方法”对象不能解释为整数 我也做了一个测试用例 my_stack = Stack() my_stack.push(12) my_stack.push(2) my_stack.push(4) my_stack.push(40) print(multi_stack(my_stack)) print(my_stack.s
my_stack = Stack()
my_stack.push(12)
my_stack.push(2)
my_stack.push(4)
my_stack.push(40)
print(multi_stack(my_stack))
print(my_stack.size())`
这应该打印出来:
3840
0
我正在使用的堆栈类
class Stack():
def __init__(self):
self.items = []
def is_empty(self):
return self.items == []
def push(self,items):
return self.items.append(items)
def pop(self):
if self.is_empty() == True:
raise IndexError("The stack is empty!")
else:
return self.items.pop()
def peek(self):
if self.is_empty() == True:
raise IndexError("The stack is empty!")
else:
return self.items[len(self.items) - 1]
def size(self):
return len(self.items)
Python列出了支持append()和pop()方法的列表,这些方法允许您复制后进先出堆栈行为。使用append()添加到末尾,使用pop()删除最后一个元素 但是,底层数据结构仍然是一个列表。您可以使用许多方法将列表相乘。例如,假设一个非空列表:
import functools
mylist = [i for i in range(1, 10)]
product = functools.reduce(lambda x, y: x * y, mylist)
或
编辑:以下是使用堆栈类的示例:
import functools
stack = Stack()
stack.push(1)
stack.push(3)
stack.push(9)
def multi_stack(s):
"""
s: a Stack() object
"""
return functools.reduce(lambda x, y: x * y, s.items)
def multi_stack_readable(s):
"""
s: a Stack() object
"""
if s.size() > 1:
product = s.items[0]
for i in s.items[1:]:
product *= i
return product
elif s.size() == 1:
return s.items
else:
raise IndexError("the stack is empty!")
print(multi_stack(stack))
print(multi_stack_readable(stack))
使用lambda函数有时被认为可读性较差,因此我使用for循环提供了一个可读性更高的版本。两者产生相同的结果。Python列表支持append()和pop()方法,允许您复制后进先出堆栈行为。使用append()添加到末尾,使用pop()删除最后一个元素 但是,底层数据结构仍然是一个列表。您可以使用许多方法将列表相乘。例如,假设一个非空列表:
import functools
mylist = [i for i in range(1, 10)]
product = functools.reduce(lambda x, y: x * y, mylist)
或
编辑:以下是使用堆栈类的示例:
import functools
stack = Stack()
stack.push(1)
stack.push(3)
stack.push(9)
def multi_stack(s):
"""
s: a Stack() object
"""
return functools.reduce(lambda x, y: x * y, s.items)
def multi_stack_readable(s):
"""
s: a Stack() object
"""
if s.size() > 1:
product = s.items[0]
for i in s.items[1:]:
product *= i
return product
elif s.size() == 1:
return s.items
else:
raise IndexError("the stack is empty!")
print(multi_stack(stack))
print(multi_stack_readable(stack))
使用lambda函数有时被认为可读性较差,因此我使用for循环提供了一个可读性更高的版本。两者产生相同的结果。您的代码不起作用,因为
size=my_stack.size
返回一个方法对象,而不是您期望的整数;您忘记在末尾添加括号以实际调用该方法。因此,当您尝试对范围内的数字(大小):执行操作时,会出现异常,因为您正在将一个方法对象而不是整数传递给范围()。还有一系列其他错误:您根本没有使用传递给函数的参数,而是影响全局变量my_stack
(除非这是您的意图);您正在对某个未知变量L
执行操作;您在函数顶部创建了堆栈
,但未对其进行任何操作,依此类推。总的来说,对于这样一个简单的目标来说太复杂了。除了更正代码外,还有其他更有效的方法:
def multi_stack(s):
mult = 1
size = s.size()
for i in range(size):
tmp = s.pop()
mult = mult * tmp
return mult
这将返回您期望的产品,尽管它不会清空堆栈。如果你想这样做,那么去掉函数参数,用s
代替my\u stack
。你的代码不起作用,因为size=my\u stack.size
返回一个方法对象,而不是你期望的整数;您忘记在末尾添加括号以实际调用该方法。因此,当您尝试对范围内的数字(大小):
执行操作时,会出现异常,因为您正在将一个方法对象而不是整数传递给范围()。还有一系列其他错误:您根本没有使用传递给函数的参数,而是影响全局变量my_stack
(除非这是您的意图);您正在对某个未知变量L
执行操作;您在函数顶部创建了堆栈
,但未对其进行任何操作,依此类推。总的来说,对于这样一个简单的目标来说太复杂了。除了更正代码外,还有其他更有效的方法:
def multi_stack(s):
mult = 1
size = s.size()
for i in range(size):
tmp = s.pop()
mult = mult * tmp
return mult
这将返回您期望的产品,尽管它不会清空堆栈。如果您想这样做,那么就去掉函数参数,并用s
替换my\u stack
,就像以前一样。是否将所有元素推到一个列表中?然后从列表中使用循环将所有数字相乘?只要将元素保留在一个列表中,然后使用append()和pop()像stack一样进行添加和删除,如果我从stack=stack()开始。为了使它成为一个列表,我是否只需要使用stack.push?您的底层数据结构也是一个列表。调用stack.items将返回一个列表,您可以通过上述方式使用该列表。我大致了解您的来源,谢谢,我仍然习惯于python,所以还没有学到很多关于导入FuncToolsO的知识,比如将所有元素推到列表中?然后从列表中使用循环将所有数字相乘?只要将元素保留在一个列表中,然后使用append()和pop()像stack一样进行添加和删除,如果我从stack=stack()开始。为了使它成为一个列表,我是否只需要使用stack.push?您的底层数据结构也是一个列表。调用stack.items将返回一个列表,您可以通过上述方式使用该列表。我大致了解您的来源,谢谢,我还在习惯python,所以还没有学到很多关于导入FuncTools的知识。你是干什么的?说真的。不要发垃圾邮件。你为什么这么做?说真的。不要滥发帖子。@Rey You's welcome:)别忘了投票并接受答案。@Rey You's welcome:)别忘了投票并接受答案。