1

隣接するリストを比較するコードがあります。各リストの 2 番目の要素は、各リストの 3 番目の要素が 1 の場合、隣接する 2 番目の要素に追加されます。次に、コードはこれらの合計されたペアの最小値を見つけ、最後にこの 2 番目の最小要素を見つけます。ペア。ただし、以下の最初の 2 つのリストのように、各ペアの最初の要素が同じ場合は無視したいと思います。

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

1 に答える 1