Python 如何解决用函数式编程方法编写的后续程序中的错误?
问题:编写一个程序,从输入流中读取具有给定列的表。列为名称、金额、债务。然后过滤表(条件:债务等于0)。之后,将债务增加42%,然后打印结果 我是Python的初学者,已经尝试过多次,但仍然无法解决这个问题。非常感谢您的帮助Python 如何解决用函数式编程方法编写的后续程序中的错误?,python,Python,问题:编写一个程序,从输入流中读取具有给定列的表。列为名称、金额、债务。然后过滤表(条件:债务等于0)。之后,将债务增加42%,然后打印结果 我是Python的初学者,已经尝试过多次,但仍然无法解决这个问题。非常感谢您的帮助 Input: 10 Tatiana Santos 411889 36881 Yuvraj Holden 121877 0 Theia Nicholson 783887 591951 Raife Padilla 445511 0 Ha
Input:
10
Tatiana Santos 411889 36881
Yuvraj Holden 121877 0
Theia Nicholson 783887 591951
Raife Padilla 445511 0
Hamaad Millington 818507 276592
Maksim Whitehead 310884 0
Iosif Portillo 773233 0
Lachlan Daniels 115100 0
Evie-Grace Reese 545083 0
Ashlea Cooper 68771 0
Required Output:
Tatiana Santos 411889 52371.02
Theia Nicholson 783887 840570.42
Hamaad Millington 818507 392760.64
My Solution:
def input_data(n):
tup = []
if n>0:
tup.append(tuple(map(str,input().split(" "))))
input_data(n-1) #I know there's a problem in the recursion. I am not #doing anything with the return value. Please help
return tup
def filtertuple(* tup): # After debugged I got to know at this point only one row is passed to function
newtuple = filter(lambda i: i[2]!=0,tup)
return tuple(newtuple)
def increasedebt(newtuple):
newtuple1 = tuple(map(lambda i:(i[2])*(142/100)),newtuple)
return (newtuple1)
def output_data():
n=int(input())
return n
print(increasedebt(filtertuple(input_data(output_data()))))
Error: Traceback (most recent call last):
File "C:\Users\msi-pc\PycharmProjects\ProgramminglanguageTask3\main.py",
line 28, in <module>
print(increasedebt(filtertuple(input_data(output_data()))))
File "C:\Users\msi-pc\PycharmProjects\ProgramminglanguageTask3\main.py",
line 14, in filtertuple
return tuple(newtuple)
File "C:\Users\msi-pc\PycharmProjects\ProgramminglanguageTask3\main.py",
line 12, in <lambda>
newtuple = filter(lambda i: i[2] != 0, tup)
IndexError: list index out of range
输入:
10
塔蒂安娜·桑托斯411889 36881
Yuvraj Holden 121877 0
泰娅·尼科尔森783887 591951
Raife Padilla 445511 0
哈马德·米林顿818507 276592
Maksim Whitehead 310884 0
Iosif Portillo 773233 0
拉克兰丹尼尔斯115100 0
Evie Grace Reese 545083 0
Ashlea Cooper 68771 0
所需输出:
塔蒂安娜·桑托斯411889 52371.02
Theia Nicholson 783887 840570.42
哈马德·米林顿818507 392760.64
我的解决方案:
def输入_数据(n):
tup=[]
如果n>0:
append(元组(映射(str,input().split(“”)))
输入数据(n-1)#我知道递归中存在问题。我没有对返回值做任何事情。请帮忙
返回tup
def filtertuple(*tup):#调试后,我知道此时只有一行被传递给函数
newtuple=过滤器(λi:i[2]!=0,tup)
返回元组(newtuple)
def增量债务(新倍数):
newtuple1=元组(映射(lambda i:(i[2])*(142/100)),newtuple)
返回(newtuple1)
def输出_数据():
n=int(输入())
返回n
打印(增加债务(过滤倍数(输入数据(输出数据())))
错误:回溯(最近一次呼叫上次):
文件“C:\Users\msi pc\PycharmProjects\ProgramminglanguageTask3\main.py”,
第28行,在
打印(增加债务(过滤倍数(输入数据(输出数据())))
文件“C:\Users\msi pc\PycharmProjects\ProgramminglanguageTask3\main.py”,
第14行,以过滤器为单位
返回元组(newtuple)
文件“C:\Users\msi pc\PycharmProjects\ProgramminglanguageTask3\main.py”,
第12行,在
newtuple=过滤器(λi:i[2]!=0,tup)
索引器:列表索引超出范围
我发现代码如何将数据从input\u data
传递到filtertuple
有两个主要问题
第一个问题是,您在input\u data
中的递归出错,您从未对递归调用的结果执行任何操作,因此只有第一行输入数据包含在最终返回值中。递归并不是解决这个问题的理想方法,循环会更简单、更干净。但是,如果您对返回给您的值执行一些操作,例如tup.extend(intput\u data(n-1))
,则可以使递归工作。如果您坚持使用递归,那么还需要使基本大小写返回适当的值(或者为None
添加额外的检查),例如空列表(或元组)
第二个问题是,filtertuple
的编写需要许多参数,但您只传递了一个参数。因此tup
将始终是一个包含实际参数的1元组。如果您希望一个参数是一个元组列表(或者元组的元组,我不确定您的目标是什么API),那么不应该在参数列表中使用*tup
,只要tup
没有星号就好了。您可以调用filtertuple(*input_data(…)
,这会将元组解压成许多参数,但如果函数只是将它们重新打包成tup
,那就太傻了
代码中可能还有其他问题,我只关注了input\u data
和filtertuple
交互,因为这就是您要问的
以下是我对解决您的问题的看法:
def gather_data(num_lines):
if num_lines == 0: # base case
return [] # returns an empty list
data = gather_data(num_lines-1) # recursive case, always gives us a list
row = tuple(map(int, input().split(" "))) # get one new row
data.append(row) # add it to the existing list
return data
def filter_zeros(data): # note, we only expect one argument (a list of tuples)
return list(filter(lambda i: i[1] != 0, data))
def adjust_debt(data): # this only returns a single column, should it return
return list(map(lambda i: (i[1]) * (142 / 100), data)) # the whole table?
# calling code:
num_lines = int(input()) # this code really didn't deserve its own function
data = gather_data(num_lines) # extra variables help debugging
filtered = filter_zeros(data) # but they could be dropped later
adjusted = adjust_debt(filtered)
print(adjusted)
我确实发现了一个额外的问题,您在我重命名为
adjust_debt
的函数中的括号错误,那么问题到底是什么?@Mureinik问题是:编写一个程序,从输入流中读取具有给定列的表。列为名称、金额、债务。然后过滤表(条件:债务等于0)。之后,将债务增加42%,然后打印结果。我已经用函数式编程的方式编写了上述代码。但是我遇到了错误,我调试了代码,发现当我在第一个函数中返回tuple(tup)时,当传递到下一个函数时,它只传递tup的第一项。它似乎已经出错了。在这里,您可以将用户输入转换为一个整数。只需将tuple强制转换为list为什么要使用def filtertuple(*tup)
作为函数签名?这意味着您的函数接受可变位置参数。只需要一个位置参数,因为这就是你使用它的方式。我知道我在很多地方都错了。但我对python非常陌生。我正试图用函数式编程的方式在python中实现这一点,所以我觉得这变得越来越困难。您是对的,当我试图打印*tup时,我只能看到一行,但我希望所有行都传递给filtertuple函数。请具体回答我应该做什么,这样无论我从第一个函数返回什么,都应该能够传入filtertuple函数,这样我就可以过滤行了。我试着做你上面提到的事,但失败了。