【问题标题】:lambda function and filtering in pythonpython中的lambda函数和过滤
【发布时间】:2015-08-25 15:46:58
【问题描述】:

我对 lambda 函数很困惑。

我有一个主机列表,需要 lt 和 gt 两种过滤方式。

这是我的主机列表 [a1.xxx.com, a2.xxx.com, a90.xxx.com, a100.xxx.com]

我需要使用 lambda 函数根据主机号 (a"x") 过滤掉这些主机。所以gt:10 应该给我[99, 100]。我只需要主机号。

所以首先我需要从每个主机中提取数字并应用 > 或 <.>

我可以使用列表推导来实现这一点,但是代码在 lt 和 gt 函数之间是重复的。我希望代码重复更少, lt 和 gt 之间的唯一变量是运算符,其他一切都很常见。有没有办法可以通过 lt,gt 运算符并使用 lambda 函数避免代码重复?

使用列表推导的当前代码

def gt(number) :
    host_list = [x.split('.')[0].split('a')[1] for x in hosts if  int(x.split('.')[0].split('a')[1]) > int(number)]
    return host_list

【问题讨论】:

  • 能贴出正在运行的代码吗?
  • 您需要向我们展示实际代码。
  • 请粘贴您的代码的 sn-p 吗?
  • 你可以看看魔术方法__lt____gt__,但是这样做很丑。
  • 我很难想象过滤器和匿名函数比相应的理解更可取的场景。推导式可以有一个函数作为参数。

标签: python lambda


【解决方案1】:

如果您的列表推导之间唯一不同的是比较运算符,则将列表推导放在一个函数中,并将 operator function 作为参数传递给它。您可以自己定义运算符函数,但 Python 的标准库中有一个 operator 模块,在这种情况下更方便。

import operator

hosts = ['a1.xxx.com', 'a2.xxx.com', 'a90.xxx.com', 'a100.xxx.com']

def filter_hosts(hosts, number, op=operator.gt):
    return [host for host in hosts
            if op(int(host.split('.', 1)[0][1:]), number)]

print(filter_hosts(hosts, 10))
print(filter_hosts(hosts, 10, op=operator.lt))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    相关资源
    最近更新 更多