我对使用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、第三个元素不是3的列表。因此列表
['1', '2', '4', 'c']
将无法通过,因为它的第一个元素是1。恰恰相反将接受第一个元素不是1或第二个元素不是2或第三个元素不是3的任何列表。因此,
['1', '2', '4', 'c']
将被接受,因为它的第三个元素不是3。x = ['1', '2', '4', 'c']
,所以x[1]=='2'
,这使得表达式(x[0] != "1" and x[1] != "2" and x[2] != "3")
被计算为False
。当条件由
and
连接时,只有当所有条件都是True
时,它们才返回True
;如果条件由or
连接,则当其中第一个条件被计算为True
时,它们才返回True
。不符合条件
以及
与其使用
or
,我相信更自然和可读的方法是:出于好奇,我比较了三种方法,呃。。。比较,结果如预期:切片列表最慢,使用元组更快,使用布尔运算符最快。更准确地说,比较的三种方法是
结果分别是:
相关问题 更多 >
编程相关推荐