4

私は、シーケンスを指定して、リスト内でそのシーケンスを見つけようとし、そのシーケンスが終了した直後にリスト項目を返す関数に取り組んでいます。

現在、このコードはシーケンスの終了直後にリスト項目を返しますが、これほど多くのネストされた if ステートメントがあることに満足しておらず、書き直したいのですが、どうすればよいかわかりません。それは私が過去に書いたものとはまったく異なり、少し練習不足に感じます。

def sequence_in_list(seq, lst):
    m, n = len(lst), len(seq)
    for i in xrange(m):
        for j in xrange(n):
            if lst[i] == seq[j]:
                if lst[i+1] == seq[j+1]:
                    if lst[i+2] == seq[j+2]:
                        return lst[i+3]

(私の意図は、この関数を拡張して、そのシーケンスがリスト全体で複数回発生した場合、シーケンスの後に最も頻繁に発生した後続のアイテムを返すようにすることです)

4

3 に答える 3

2

ジェネレーターとスライスを使用してこれを行います。

sequence = [1, 2, 3, 5, 1, 2, 3, 6, 1, 2, 3]
pattern = [1, 2, 3]

def find_item_after_pattern(sequence, pattern):
    n = len(pattern)

    for index in range(0, len(sequence) - n):
        if pattern == sequence[index:index + n]:
            yield sequence[index + n]

for item in find_item_after_pattern(sequence, pattern):
    print(item)

そして、あなたは得るでしょう:

5
6

この関数はあまり効率的ではなく、無限のシーケンスでは機能しませんが、短くて汎用的です。

于 2013-07-19T08:55:20.403 に答える
0

リスト内包表記とスライスを組み合わせて、比較をより読みやすくすることができます。

n, m = len(lst), len(seq)
[lst[j+3] for i in range(m-2) for j in range(n-2) if seq[i:i+3] == lst[j:j+3]]

もちろん、もっと効率的な方法はありますが、これはシンプルで短く、Python スタイルです。

于 2013-07-19T08:59:20.217 に答える