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

新手上路,请多包涵

给定以下列表:

 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)

原文由 Homap 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 705
2 个回答

使用 lambda 提供阈值,如下所示:

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

原文由 Andrea Corbellini 发布,翻译遵循 CC BY-SA 3.0 许可协议

您正在尝试做的事情被称为 部分函数应用程序:您有一个具有多个参数的函数(在本例中为 2),并且想要从它派生一个固定有一个或多个参数的函数,然后您可以将其传递给 filter

某些语言(尤其是函数式语言)“内置”了此功能。在 python 中,您可以使用 lambda 来执行此操作(如其他人所示),或者您可以使用 functools library 。特别是, functools.partial

partial() 用于部分函数应用程序,它“冻结”函数参数和/或关键字的某些部分,从而生成具有简化签名的新对象。例如,partial() 可用于创建一个行为类似于 int() 函数的可调用函数,其中基本参数默认为两个:

>  >>> 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)

”`

原文由 LeartS 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题