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

新手上路,请多包涵

我对使用 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)

我在这里做什么傻事?还是我的理解不正确?

原文由 user3300676 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 719
2 个回答

x = ['1', '2', '4', 'c']x[1]=='2' (x[0] != "1" and x[1] != "2" and x[2] != "3") False

When conditions are joined by and , they return True only if all conditions are True , and if they are joined by or , they返回 True 当其中第一个被评估为 True

原文由 shiva 发布,翻译遵循 CC BY-SA 3.0 许可协议

['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]

原文由 juanpa.arrivillaga 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题