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

问题:编写一个程序,从输入流中读取具有给定列的表。列为名称、金额、债务。然后过滤表(条件:债务等于0)。之后,将债务增加42%,然后打印结果

我是Python的初学者,已经尝试过多次,但仍然无法解决这个问题。非常感谢您的帮助

   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函数,这样我就可以过滤行了。我试着做你上面提到的事,但失败了。