3

課題は、整数の 2 つのかなり小さなリスト (ほとんどの場合、それぞれ 10 要素未満) を比較する関数を作成することです。1 つのリストは次のようになります。

self = [0, 0, 1, 2]

比較対象のリストは、次の例のいずれかのようになります。

other1 = []
other2 = [0, 0, 1]
other3 = [0, 0, 1, 2, 0]
other4 = [0, 1, 1, 2]
other5 = something

ご覧のとおり、要素の重複は非常に一般的であり、要素の順序が重要です。

期待される結果は、最初から数えて、self と other が同じである期間を表す整数でなければなりません。したがって、その他に応じて、結果は次のようになります。

result1 = 0
result2 = 3
result3 = 4
result4 = 1
result5 = 0

このコードは、ユーザーとの対話ごとに約 100 回使用されるため、最も効率的である必要があります。

私は次のようにコーディングしました。希望どおりに動作しますが、少し遅いようです:

def match(self, other):
    if self == other:
        return len(self)
    element = -1
    for element in range(min(len(self),  len(other))):
        if self[element] != other[element]:
            element -= 1
            break
    return element +1

最初の if ステートメントは、既に高速化のための拡張機能ですが、解決策は依然として遅く、element という名前の変数と 2 つの return ステートメントに対するすべての修正により、少しぎこちなく見えます。

「一致」または「比較」よりも優れたそのような関数の名前はありますか?

4

3 に答える 3

4
>>> from itertools import takewhile, izip
>>> def F(seq1, seq2):
        return sum(1 for x in takewhile(lambda x: x[0] == x[1], izip(seq1, seq2)))

>>> F([0, 0, 1, 2], [0, 0, 1, 2, 0])
4
于 2013-03-17T05:43:14.633 に答える
1

関連する質問で、次の潜在的な解決策を投稿しました。

def while_equal(seq, other):
    for this, that in zip(seq, other):
        if this != that:
            return
        yield this

def match(seq, other):
    return sum(1 for _ in while_equal(seq, other))

def match_loop(seq, other):
    count = 0
    for this, that in zip(seq, other):
        if this != that:
            return count
        count += 1
    return count

これらのバージョンはどちらも、他の特定のソリューションよりも高速で (2 番目のソリューションが最速)、読みやすくなっています。

于 2013-03-18T13:41:28.647 に答える
0

編集: jamylak が指摘したように、私の解決策は間違っています。最初の 2 つのケースだけでなく、この質問に答えたいすべての人が問題全体を見ることができるように、ここに残しておきます。

を必要としないさらに別のソリューションですが、ジャミラークのソリューションitertoolsほど効率的ではありません。

def compareLists(list1, list2):
    return sum(map(lambda (x,y): 1 if x == y else 0, zip(list1, list2)))
于 2013-03-17T09:00:36.117 に答える