-1

我最近问了一个关于检索两个满足条件的列表之间差异的问题,但我一直未能更改下面的示例 LAMBDA 表达式以对单个列表中的项目执行相同操作:

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

2 回答 2

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']
>>>
于 2013-07-14T17:13:03.180 回答
0

根据您的评论,我相信以下列表理解应该可以满足您的需求。关键部分是:

  • 使用any而不是all检查是否存在任何项目,该项目最多比当前正在查看的项目小或大 5
  • 用于enumerate确保条件忽略当前正在查看的项目 -如果您知道没有重复项,您可以删除调用enumerate并将比较更改为0 < abs(int(a) - int(b)) <= 5
  • 在我看来(只是)使用列表理解而不是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']

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

于 2013-07-14T17:12:04.753 回答