Python 兰姆达的情况?

Python 兰姆达的情况?,python,lambda,conditional-statements,Python,Lambda,Conditional Statements,我有比较相邻列表的代码,如果每个列表的第三个元素为1,则每个列表的第二个元素将被添加到其相邻的第二个元素。然后,代码会找到这些求和对中最低的一个,最后是该对中最低的第二个元素。但是现在我想忽略每对的第一个元素相同的情况,例如下面的前两个列表 aList = [[10564, 15, 1], [10564, 13, 1], [10589, 18, 1], [10637, 39, 1], [10662, 38, 1], [10837, 1, 1], [3, 17, 13], [7, 21, 13],

我有比较相邻列表的代码,如果每个列表的第三个元素为1,则每个列表的第二个元素将被添加到其相邻的第二个元素。然后,代码会找到这些求和对中最低的一个,最后是该对中最低的第二个元素。但是现在我想忽略每对的第一个元素相同的情况,例如下面的前两个列表

aList = [[10564, 15, 1], [10564, 13, 1], [10589, 18, 1], [10637, 39, 1], [10662, 38, 1], [10837, 1, 1], [3, 17, 13], [7, 21, 13], [46, 26, 13]]

import sys
from operator import itemgetter
from itertools import tee, izip,ifilter

def pairwise(iterable):
    #"s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

def neighbouring_minimum(iterable):
    paired = pairwise(iterable)

    # find minimum pair by second elements summed
    minpair = min(paired, key=lambda pair: pair[0][1] + pair[1][1])  
    return min(minpair, key=itemgetter(1))

filtered = ifilter(lambda x: x[2] == 1, aList)
print neighbouring_minimum(filtered)
如果我改变,我对兰姆达是新来的

minpair = min(paired, key=lambda pair: pair[0][1] + pair[1][1])  
对于下面的代码,这是正确的功能吗?是否有更简洁的方法来编写

minpair = min(paired, key=lambda pair: pair[0][1] if (pair[0][0] != pair[1][0]) else pair[0][1] + pair[1][1] )  

你的逻辑颠倒了;如果对的第一个元素不相等,则返回对[0][1]。反转条件:

minpair = min(paired, key=lambda pair: pair[0][1] if pair[0][0] == pair[1][0] else pair[0][1] + pair[1][1])  
但是,请注意,求和对的值可能比任何单个值都大。对于您的示例,您的逻辑将返回
15
,这肯定低于您为示例输入生成的任何其他相邻总和:

>>> map(lambda pair: pair[0][1] if pair[0][0] == pair[1][0] else pair[0][1] + pair[1][1], pairwise(aList))
[15, 31, 57, 77, 39, 18, 38, 47]
上面的示例向您展示了lambda生成的值,以及
15
将赢得的最小值

要忽略第一个元素相同的对,应返回
float('inf')

<代码>浮点('nf')(正无穷大)总是要高于任何相加的对,所以<代码> min()/<代码>不会考虑该特定对。

现在输出为:

>>> map(lambda pair: pair[0][1] + pair[1][1] if pair[0][0] != pair[1][0] else float('inf'), pairwise(aList))
[inf, 31, 57, 77, 39, 18, 38, 47]

将挑选总共为
18
的一对。

float('int')
更通用(对于int/float等,总是大于除自身以外的任何值)。谢谢,即使我得到了正确的结果,我也知道发生了什么。@JonClements:啊,是的,
float('inf')
,而不是
int
)我在这里有一种似曾相识的感觉……我认为这两种价值观中的任何一种都能现实地做到:D谢谢!
>>> map(lambda pair: pair[0][1] + pair[1][1] if pair[0][0] != pair[1][0] else float('inf'), pairwise(aList))
[inf, 31, 57, 77, 39, 18, 38, 47]