python 具有多个条件的 lambda 列表过滤
python lambda list filtering with multiple conditions
我对使用 lambda 过滤列表的理解是,过滤器将 return 列表的所有元素 return 对于 lambda 函数为真。在那种情况下,对于以下代码,
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" and x[1] != "2" and x[2] != "3")
被计算为 False
.
当条件由 and
连接时,它们 return True
仅当所有条件都为 True
并且它们由 or
连接时,他们 return True
当他们中的第一个被评估为 True
.
['1', '2', '4', 'c']
不满足条件
x[0] != "1"
以及
x[1] != "2"
而不是使用or
,我相信更自然和可读的方式是:
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")
过滤器仅 "accepts" 列出第一个元素不是 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。
我对使用 lambda 过滤列表的理解是,过滤器将 return 列表的所有元素 return 对于 lambda 函数为真。在那种情况下,对于以下代码,
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" and x[1] != "2" and x[2] != "3")
被计算为 False
.
当条件由 and
连接时,它们 return True
仅当所有条件都为 True
并且它们由 or
连接时,他们 return True
当他们中的第一个被评估为 True
.
['1', '2', '4', 'c']
不满足条件
x[0] != "1"
以及
x[1] != "2"
而不是使用or
,我相信更自然和可读的方式是:
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")
过滤器仅 "accepts" 列出第一个元素不是 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。