带映射和lamda的过滤功能

时间:2019-11-23 17:55:56

标签: python

我编写了一个试图计算和映射列表的函数,为此它可以很好地工作。但是,当我尝试使用过滤器过滤出映射结果中小于5的所有整数值并返回列表时,它给我一个错误“ TypeError:'NoneType'对象不可迭代”,有人可以帮我解决这个问题?

def compute(value):
    if type(value) == int or type(value) == float:
        return value ** 2
    elif type(value) == str:
        return value[::-1] 
def map_compute(my_list):
        print(list(map(compute, my_list)))

它可以正常工作,直到此处为过滤器选项为止

def filter_compute(my_list):
    number_list = map_compute(my_list)
    new_list = list(filter(lambda x: x > 5, number_list))
    print(new_list)
filter_compute(['cup', '321', 2, ['x'], 4])

我想要的是:

示例:函数调用:

filter_compute(['cup', '321', 2, ['x'], 4])

预期的返回输出:

['puc', '123', None, 16]

另一个问题是还有其他方法吗,例如仅使用lambda来完成上述所有功能?

3 个答案:

答案 0 :(得分:0)

更改

def map_compute(my_list):
        print(list(map(compute, my_list)))

def map_compute(my_list):
        return list(map(compute, my_list))

使用print函数将从map_compute返回None对象,这导致number_list var为None,并且将引起由{{ 1}}函数,该函数希望获得可迭代的项,但将得到filter

答案 1 :(得分:0)

警告

首先,有一件重要的事情要解决:为什么要检查类型?应该尽可能避免这种情况,尤其是在这种情况下。您的程序纯粹是出于教育目的吗?

您问:另一个问题是还有其他方法吗,例如仅使用lambda来完成上述所有功能?答案是肯定的,还有其他方法,不, lambda不好。


代码审查

让我们看看您的代码。


def compute(value):
    if type(value) == int or type(value) == float:
        return value ** 2
    elif type(value) == str:
        return value[::-1] 

如上所述,应避免类型检查。该函数的名称及其参数需要改进,它们是通用的,没有描述性,没有提供有用的信息。


def map_compute(my_list):
        print(list(map(compute, my_list)))

print()将一个值打印到stdout,您可能希望使用return。我也强烈建议不要使用map()。但是,这甚至都没有关系,因为您可以完全摆脱此功能。


def filter_compute(my_list):
    number_list = map_compute(my_list)
    new_list = list(filter(lambda x: x > 5, number_list))
    print(new_list)

再次print()-> returnfilter()与地图很像,是单项的。尽管这取决于其预期的目的,但该功能似乎也不必要。实际上,该代码将崩溃,因为您正在将int(5)与字符串和一个list进行比较。


解决方案(ish)

现在,这是我重写程序的方式:

def comp_value(val_in):
    if isinstance(val_in, int) or isinstance(val_in, float):
        return val_in ** 2
    elif isinstance(val_in, str):
        return val_in[::-1]
    else:
        return None


list_1 = ['cup', '321', 2, ['x'], 4]

list_2 = [comp_value(item) for item in list_1]

list_3 = [item for item in list_2 if item > 5]

print(list_3)

这两个多余的功能被简单的列表理解所取代。该代码仍然没有多大意义,并且会崩溃,当然,重要的部分是如何编写。

答案 2 :(得分:-2)

以下(使用内联条件和列表理解)。

它可以工作,但是可读性不高,我认为您应该避免使用这种代码。

lst = ['cup', '321', 2, ['x'], 4]

new_lst = [x ** 2 if isinstance(x, (int, float)) else x[::-1] if isinstance(x, str) else None for x in lst]
print(new_lst)

输出

['puc', '123', 4, None, 16]