当前位置:  开发笔记 > 编程语言 > 正文

在python中将带有两个参数的函数传递给filter()

如何解决《在python中将带有两个参数的函数传递给filter()》经验,为你挑选了3个好方法。

鉴于以下列表:

DNA_list = ['ATAT', 'GTGTACGT', 'AAAAGGTT']

我想过滤超过3个字符的字符串.我用以下代码实现了这一点:

使用for循环:

long_dna = []
for element in DNA_list:
    length = len(element)
    if int(length) > 3:
        long_dna.append(element)
print long_dna

但我希望我的代码更通用,所以我以后可以过滤任何长度的字符串,所以我使用一个函数和for循环:

def get_long(dna_seq, threshold):
    return len(dna_seq) > threshold

long_dna_loop2 = []
for element in DNA_list:
    if get_long(element, 3) is True:
        long_dna_loop2.append(element)
print long_dna_loop2

我希望使用相同的通用性,filter()但我无法实现这一点.如果我使用上面的函数get_long(),当我使用它时,我根本无法传递参数filter().这是不可能的还是有办法绕过它?

我的代码与filter()特定情况:

def is_long(dna):
        return len(dna) > 3

    long_dna_filter = filter(is_long, DNA_list)

Andrea Corbe.. 15

使用lambda提供的门槛,就像这样:

filter(lambda seq: get_long(seq, 3),
       dna_list)


LeartS.. 15

你要做的是被称为部分函数应用程序:你有一个带有多个参数的函数(在这种情况下,2)并且希望得到一个从它派生的函数,其中一个或多个参数是固定的,然后你可以传递给它filter.

某些语言(特别是功能语言)具有"内置"功能.在python中,您可以使用lambdas来执行此操作(正如其他人所示)或您可以使用该functools库.特别是functools.partial:

partial()用于部分函数应用程序,它"冻结"函数的参数和/或关键字的某些部分,从而产生具有简化签名的新对象.例如,partial()可用于创建一个callable,其行为类似于int()函数,其中base参数默认为2:

>>> from functools import partial
>>> basetwo = partial(int, base=2)
>>> basetwo.__doc__ = 'Convert base 2 string to an int.'
>>> basetwo('10010')
18

所以你可以这样做:

filter(functools.partial(get_long, treshold=13), DNA_list)


mhawke.. 10

你需要用filter()吗?为什么不使用更多的Pythonic列表理解?

例:

>>> DNA_list = ['ATAT', 'GTGTACGT', 'AAAAGGTT']
>>> threshold = 3
>>> long_dna = [dna_seq for dna_seq in DNA_list if len(dna_seq) > threshold]
>>> long_dna
['ATAT', 'GTGTACGT', 'AAAAGGTT']

>>> threshold = 4
>>> [dna_seq for dna_seq in DNA_list if len(dna_seq) > threshold]
['GTGTACGT', 'AAAAGGTT']

这种方法的优点是可以将它转换为生成器,这可以提供改进的内存和执行,具体取决于您的应用程序,例如,如果您有大量的DNA序列,并且您想迭代它们,将它们作为列表实现一次消耗大量内存.等效发电机只需要用圆括号替换方[]括号():

>>> long_dna = (dna_seq for dna_seq in DNA_list if len(dna_seq) > threshold)
 at 0x7f50de229cd0>
>>> list(long_dna)
['GTGTACGT', 'AAAAGGTT']

在Python 2中,这种性能改进不是一种选择,filter()因为它返回一个列表.在Python 3中,filter()返回一个更类似于生成器的过滤器对象.



1> Andrea Corbe..:

使用lambda提供的门槛,就像这样:

filter(lambda seq: get_long(seq, 3),
       dna_list)



2> LeartS..:

你要做的是被称为部分函数应用程序:你有一个带有多个参数的函数(在这种情况下,2)并且希望得到一个从它派生的函数,其中一个或多个参数是固定的,然后你可以传递给它filter.

某些语言(特别是功能语言)具有"内置"功能.在python中,您可以使用lambdas来执行此操作(正如其他人所示)或您可以使用该functools库.特别是functools.partial:

partial()用于部分函数应用程序,它"冻结"函数的参数和/或关键字的某些部分,从而产生具有简化签名的新对象.例如,partial()可用于创建一个callable,其行为类似于int()函数,其中base参数默认为2:

>>> from functools import partial
>>> basetwo = partial(int, base=2)
>>> basetwo.__doc__ = 'Convert base 2 string to an int.'
>>> basetwo('10010')
18

所以你可以这样做:

filter(functools.partial(get_long, treshold=13), DNA_list)



3> mhawke..:

你需要用filter()吗?为什么不使用更多的Pythonic列表理解?

例:

>>> DNA_list = ['ATAT', 'GTGTACGT', 'AAAAGGTT']
>>> threshold = 3
>>> long_dna = [dna_seq for dna_seq in DNA_list if len(dna_seq) > threshold]
>>> long_dna
['ATAT', 'GTGTACGT', 'AAAAGGTT']

>>> threshold = 4
>>> [dna_seq for dna_seq in DNA_list if len(dna_seq) > threshold]
['GTGTACGT', 'AAAAGGTT']

这种方法的优点是可以将它转换为生成器,这可以提供改进的内存和执行,具体取决于您的应用程序,例如,如果您有大量的DNA序列,并且您想迭代它们,将它们作为列表实现一次消耗大量内存.等效发电机只需要用圆括号替换方[]括号():

>>> long_dna = (dna_seq for dna_seq in DNA_list if len(dna_seq) > threshold)
 at 0x7f50de229cd0>
>>> list(long_dna)
['GTGTACGT', 'AAAAGGTT']

在Python 2中,这种性能改进不是一种选择,filter()因为它返回一个列表.在Python 3中,filter()返回一个更类似于生成器的过滤器对象.

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有