我最近提出了一个问题,即检索两个满足条件的列表之间的差异,但我仍然没有改变下面的示例LAMBDA EXPRESSION来对单个列表中的项目执行相同的操作:
A = ['12', '15', '20', '30']
filter(lambda a: all([abs(int(a) - int(b)) >= 5 for b in List1]), List2)
我的列表在哪里排序,并且可以有不同的长度。目标是更改上面的表达式,以便只检索那些与列表中的任何其他项目差别小于或等于5的项目。
上面列表中的输出应该是:
newAList = ['12', '15', '20']
答案 0 :(得分:1)
这是一个较短的版本:
>>> A = ['12', '15', '20', '30']
>>> [x for x in A if len(A) == 1 or filter(lambda y: 0 < abs(int(y) - int(x)) <= 5,A)]
['12', '15', '20']
>>>
答案 1 :(得分:0)
根据您的评论,我相信以下列表理解应该做您想要的。关键部分是:
any
代替all
来检查是否存在最多比正在查看的当前项目小5或更大的项目enumerate
确保条件忽略当前正在查看的项目 - 如果您知道没有重复项,则可以移除对enumerate
的调用并将比较更改为0 < abs(int(a) - int(b)) <= 5
< / LI>
filter
使其更具可读性,在我看来(仅仅是) - 应该可以使用filter
执行相同的操作,但是代码:
>>> A = ['12', '15', '20', '30']
>>> [a for i, a in enumerate(A) if any(j != i and abs(int(a) - int(b)) <= 5 for j, b in enumerate(A))]
['12', '15', '20']
我敢打赌,对于任何比这个大得多的列表来说,这将是非常低效的,因为你将为列表中的每个项目迭代一次列表。但是,希望它足以为你提供一个起点。