首页 > 解决方案 > 递归地定义带有谓词的映射

问题描述

如果元素满足谓词,我想定义一个映射列表元素的映射函数。

我的想法是将列表分成两半并递归应用该函数。捕获基础将是当列表中只剩下 1 个元素时,该元素将被检查 if prae(element) == True、 True ->fun(x)和 False -> pass。然后我将连接两半以获得最终列表。

def is_odd(n):
  return n%2 == 1

def square(x):
  return x**2

def map_ifr(lis,prae,fun):
  if len(lis) == 1:
      results = [fun(x) for x in lis if prae(x) == True]
  else:
    mid = len(lis)//2
    first_half = lis[:mid]
    second_half = lis[mid:]
    map_ifr(first_half,prae,fun) + map_ifr(second_half,prae,fun)

a = map_ifr([1 , 2 , 3 , 4 , 5 , 6 ], is_odd , square )
a

我得到操作数类型为的错误Nonetype。我不确定为什么会这样。我经常遇到问题,Nonetype不知道它的真正原因。感谢您的帮助

标签: pythonrecursion

解决方案


您不会从map_ifr函数返回任何内容,因此默认情况下它会返回Nonemap_ifr(first_half,prae,fun) + map_ifr(second_half,prae,fun)在线失败,因为None + None不是有效的操作。更正的代码:

def map_ifr(lis, prae, fun):
  if len(lis) == 1:
      results = [x for x in lis if prae(x) == True]
  else:
      mid = len(lis)//2
      first_half = lis[:mid]
      second_half = lis[mid:]
      results = map_ifr(first_half,prae,fun) + map_ifr(second_half,prae,fun)

  return results

a = map_ifr([1 , 2 , 3 , 4 , 5 , 6 ], is_odd , square)
print(a)

输出:

[1, 3, 5]


推荐阅读