1

我有一个元组列表:

lst = [('654', '2.12', '86'), ('2', '756'), ('5', '1.77', '71'), ('1.65', '55')]

功能

num = min(lst,key=lambda x: abs(float(x[1]) - 2))

x[1]在每个元组内的位置查找每个数字并输出x[1]最接近 2 的元组。是否可以调整函数以使其仅查找具有 的元组len == 3

如果是这样,我想同时输出那个元组和下面的 2 项。例如,对于上面的最终结果应该是:

[('654', '2.12', '86'), ('2', '756')]有了这个,我认为 for 循环就足够了,所以我想我会管理的。

4

4 回答 4

3

如果列表总是在 3 元组和 2 元组之间交替,您可以使用

zip(*[iter(lst)]*2)

项目组合成对。然后你可以min基本上像以前一样使用:

In [39]: min(zip(*[iter(lst)]*2),key=lambda (x,y): abs(float(x[1]) - 2))
Out[39]: (('654', '2.12', '86'), ('2', '756'))
于 2013-03-14T10:56:46.610 回答
1

Lambda 只能包含表达式,因此您只能使用条件表达式:

lambda x: abs(float(x[1]) - 2) if len(x) == 3 else float('inf')

但这只会返回一个 3 元素元组。该key函数只能考虑序列中的一个元素。

如果您的 3 元素元组后面总是有一个 2 元素元组,则需要将它们组合在一起,然后从这些配对元组中确定最小值(正如 unutbu 的答案所做的那样)。

于 2013-03-14T10:55:41.523 回答
1

您可以使用生成器表达式过滤列表:

num = min((t for t in list if len(t) == 3), key=lambda x: abs(float(x[1]) - 2))
于 2013-03-14T11:02:35.017 回答
1

你可以:

num = min([el for el in lst if len(el)==3], key=lambda x: abs(float(x[1]) - 2))

这突出了问题,您在列表中使用了异构数据。如果所有元组都不是同一个东西,它们可能不属于同一个列表。

于 2013-03-14T11:06:07.630 回答