减去单个列表中的项目并检索与条件匹配的项目

时间:2013-07-14 16:17:46

标签: python list lambda list-comprehension

我最近提出了一个问题,即检索两个满足条件的列表之间的差异,但我仍然没有改变下面的示例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']

2 个答案:

答案 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']

我敢打赌,对于任何比这个大得多的列表来说,这将是非常低效的,因为你将为列表中的每个项目迭代一次列表。但是,希望它足以为你提供一个起点。