我对lambda函数非常困惑。
我有一个主机列表,需要2个过滤方式lt和gt。
这是我的主持人名单 [a1.xxx.com,a2.xxx.com,a90.xxx.com,a100.xxx.com]
我需要使用lambda函数根据主机号(“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
答案 0 :(得分:0)
如果列表推导之间唯一不同的是比较运算符,则将列表推导放在函数中,并将运算符函数作为参数传递给它。您可以自己定义操作符函数,但在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))