我有比较相邻列表的代码,如果每个列表的第三个元素是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)
如果我换衣服的话,我是新来的
^{pr2}$对于下面的代码,这是正确的功能吗?有没有更简洁的方法来编写它?在
minpair = min(paired, key=lambda pair: pair[0][1] if (pair[0][0] != pair[1][0]) else pair[0][1] + pair[1][1] )
您的逻辑颠倒了;如果对的第一个元素是不等的,则返回
pair[0][1]
。反转条件:但是,请注意,求和对的值可能比任何单个值的值都大。对于您的示例,您的逻辑将返回
^{pr2}$15
,这比为示例输入生成的任何其他邻居和都要低:上面的示例向您展示了lambda生成的值,
15
将作为最小值获胜。在若要忽略第一个元素相同的对,则应返回
float('inf')
:float('inf')
(正无穷大)总是高于任何求和对,因此min()
将不考虑该特定对。在现在的输出是:
并且将选择总计
18
的对。在相关问题 更多 >
编程相关推荐