具有多个条件的python lambda列表过滤

具有多个条件的python lambda列表过滤,python,list,lambda,filter,multiple-conditions,Python,List,Lambda,Filter,Multiple Conditions,我对使用lambda过滤列表的理解是,对于lambda函数,过滤器将返回列表中所有返回True的元素。在这种情况下,对于以下代码 inputlist = [] inputlist.append(["1", "2", "3", "a"]) inputlist.append(["4", "5", "6", "b"]) inputlist.append(["1", "2", "4", "c"]) inputlist.append(["4", "5", "7", "d"]) outputlist =

我对使用lambda过滤列表的理解是,对于lambda函数,过滤器将返回列表中所有返回True的元素。在这种情况下,对于以下代码

inputlist = []
inputlist.append(["1", "2", "3", "a"])
inputlist.append(["4", "5", "6", "b"])
inputlist.append(["1", "2", "4", "c"])
inputlist.append(["4", "5", "7", "d"])

outputlist = filter(lambda x: (x[0] != "1" and x[1] != "2" and x[2] != "3"), inputlist)
for item in outputlist: print(item)
输出应该是

['4', '5', '6', 'b']
['1', '2', '4', 'c']
['4', '5', '7', 'd']
但我得到的结果是

['4', '5', '6', 'b']
['4', '5', '7', 'd']
如果我使用

outputlist = filter(lambda x: (x[0] != "1" or x[1] != "2" or x[2] != "3"), inputlist)

我在这里干什么?还是我的理解不正确?

那么,
['1','2','4','c']
不满足
x[0]!=“1”
,也不满足
x[1]!=“2”

x=['1',2',4',c']
,因此
x[1]='2'
,这使得表达式
(x[0]!=“1”和x[1]!=“2”和x[2]!=“3”)的计算结果为
False

当条件通过
连接时,只有当所有条件都是
时,它们才返回
;如果条件通过
连接,当第一个条件被评估为
时,它们返回

['1', '2', '4', 'c']
不符合条件

x[0] != "1"
以及

x[1] != "2"
我认为更自然易读的方法不是使用
,而是:

lambda x: (x[0], x[1], x[2]) != ('1','2','3')
出于好奇,我比较了三种方法,呃。。。通过比较,结果与预期的一样:切片列表速度最慢,使用元组速度更快,使用布尔运算符速度最快。更准确地说,对这三种方法进行了比较

list_slice_compare = lambda x: x[:3] != [1,2,3]

tuple_compare = lambda x: (x[0],x[1],x[2]) != (1,2,3)

bool_op_compare = lambda x: x[0]!= 1 or x[1] != 2 or x[2]!= 3
结果分别是:

In [30]: timeit.Timer(setup="import timeit,random; rand_list = [random.randint(1,9) for _ in range(4)]; list_slice_compare = lambda x: x[:3] != [1,2,3]", stmt="list_slice_compare(rand_list)").repeat()
Out[30]: [0.3207617177499742, 0.3230015148823213, 0.31987868894918847]

In [31]: timeit.Timer(setup="import timeit,random; rand_list = [random.randint(1,9) for _ in range(4)]; tuple_compare = lambda x: (x[0],x[1],x[2]) != (1,2,3)", stmt="tuple_compare(rand_list)").repeat()
Out[31]: [0.2399928924012329, 0.23692036176475995, 0.2369164465619633]

In [32]: timeit.Timer(setup="import timeit,random; rand_list = [random.randint(1,9) for _ in range(4)]; bool_op_compare = lambda x: x[0]!= 1 or x[1] != 2 or x[2]!= 3", stmt="bool_op_compare(rand_list)").repeat()
Out[32]: [0.144389363900018, 0.1452672728203197, 0.1431527621755322]

过滤器的作用与它应该的完全一样。在第一种情况下

lambda x: (x[0] != "1" and x[1] != "2" and x[2] != "3")
过滤器仅“接受”列出第一个元素不是1、第二个元素不是2、第三个元素不是3的元素。因此,列表
['1','2','4','c']
将无法通过,因为它的第一个元素是1。相反,

lambda x: (x[0] != "1" or x[1] != "2" or x[2] != "3")

将接受第一个元素不是1、第二个元素不是2或第三个元素不是3的任何列表。因此,
['1','2','4','c']
将被接受,因为它的第三个元素不是3。

如果您使用
右侧的列表=,然后可以使用左侧的切片
x[:3]!=[“1”、“2”、“3”]
我们无法判断您的理解是否正确,因为您没有告诉我们您希望
lambda
函数做什么。如果将条件与
合并,则除非所有条件均为true,否则它不会计算为
true
。如果你用
加入条件,如果只有一个条件是真的,它将计算为
真的
。现在我真的感觉很傻!我想我需要停止工作,上床睡觉。抱歉浪费你们的时间,伙计们。