如何解决用函数式编程方法编写的后续程序中的错误?

2024-09-30 12:15:47 发布

您现在位置:Python中文网/ 问答频道 /正文

问题:编写一个程序,从输入流中读取具有给定列的表。列为名称、金额、债务。然后过滤表(条件:债务等于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

Tags: lambdaininputoutputdatareturndefusers
1条回答
网友
1楼 · 发布于 2024-09-30 12:15:47

我发现代码如何将数据从input_data传递到filtertuple有两个主要问题

第一个问题是input_data中的递归出错,您从未对递归调用的结果执行任何操作,因此只有第一行输入数据包含在最终返回值中。递归并不是解决这个问题的理想方法,循环会更简单、更干净。但是如果您使用返回给您的值做一些事情,比如^{,您可以使递归工作。如果您坚持使用递归,还需要使基本大小写返回适当的值(或者为None添加额外的检查),例如空列表(或元组)

第二个问题是filtertuple的编写需要许多参数,但您只传递了一个参数。因此tup将始终是一个包含实际参数的1元组。如果您希望一个参数是元组列表(或者元组的元组,我不确定您的目标是什么API),那么不应该在参数列表中使用*tup,只要tup没有星号就好了。您可以调用filtertuple(*input_data(...)),这将把元组解压成许多参数,但是如果函数只是将它们重新打包成tup,那就太傻了

代码中可能还有其他问题,我只关注了input_datafiltertuple的交互,因为这就是您要问的

以下是我对解决您的问题的看法:

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的函数中,括号错误

相关问题 更多 >

    热门问题