6

リストのリストがあり、各リストには繰り返しシーケンスがあります。リスト内の整数の繰り返しシーケンスの長さを数えようとしています:

list_a = [111,0,3,1,111,0,3,1,111,0,3,1] 

list_b = [67,4,67,4,67,4,67,4,2,9,0]

list_c = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,23,18,10]

どちらが返されますか:

list_a count = 4 (for [111,0,3,1])

list_b count = 2 (for [67,4])

list_c count = 10 (for [1,2,3,4,5,6,7,8,9,0])

アドバイスやヒントは大歓迎です。私は今re.compileでそれを解決しようとしていますが、それは完全には正しくありません。

4

3 に答える 3

11

シーケンス長の2から半分の間の推測を繰り返すことによってシーケンス長を推測します。パターンが検出されない場合は、デフォルトで1を返します。

def guess_seq_len(seq):
    guess = 1
    max_len = len(seq) / 2
    for x in range(2, max_len):
        if seq[0:x] == seq[x:2*x] :
            return x

    return guess

list_a = [111,0,3,1,111,0,3,1,111,0,3,1] 
list_b = [67,4,67,4,67,4,67,4,2,9,0]
list_c = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,23,18,10]

print guess_seq_len(list_a)
print guess_seq_len(list_b)
print guess_seq_len(list_c)
print guess_seq_len(range(500))   # test of no repetition

これにより(予想どおり):

4
2
10
1

要求に応じて、この代替案は最長の繰り返しシーケンスを提供します。したがって、list_bに対して4を返します。唯一の変更guess = xreturn x

def guess_seq_len(seq):
    guess = 1
    max_len = len(seq) / 2
    for x in range(2, max_len):
        if seq[0:x] == seq[x:2*x] :
            guess = x

    return guess
于 2012-07-08T18:58:25.700 に答える
0

私はMariaのより速く、よりスタックオーバーフローに準拠した答えを取り、最初に最大のシーケンスを見つけさせました。

def guess_seq_len(seq, verbose=False):
    seq_len = 1
    initial_item = seq[0]
    butfirst_items = seq[1:]
    if initial_item in butfirst_items:
        first_match_idx = butfirst_items.index(initial_item)
        if verbose:
            print(f'"{initial_item}" was found at index 0 and index {first_match_idx}')
        max_seq_len = min(len(seq) - first_match_idx, first_match_idx)
        for seq_len in range(max_seq_len, 0, -1):
            if seq[:seq_len] == seq[first_match_idx:first_match_idx+seq_len]:
                if verbose:
                    print(f'A sequence length of {seq_len} was found at index {first_match_idx}')
                break
    
    return seq_len
于 2021-03-11T13:21:08.893 に答える
-1

これは私のために働いた。

def repeated(L):
    '''Reduce the input list to a list of all repeated integers in the list.'''
    return [item for item in list(set(L)) if L.count(item) > 1]

def print_result(L, name):
    '''Print the output for one list.'''
    output = repeated(L)
    print '%s count = %i (for %s)' % (name, len(output), output)

list_a = [111, 0, 3, 1, 111, 0, 3, 1, 111, 0, 3, 1]
list_b = [67, 4, 67, 4, 67, 4, 67, 4, 2, 9, 0]
list_c = [
    1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2,
    3, 4, 5, 6, 7, 8, 9, 0, 23, 18, 10
]

print_result(list_a, 'list_a')
print_result(list_b, 'list_b')
print_result(list_c, 'list_c')

Pythonのset()関数は、リストをセットに変換します。これは、代数のセットのように、任意の値の1つのみを含むことができるデータ型です。入力リストをセットに変換してからリストに戻し、リストを一意の値のみに減らしました。次に、これらの値のそれぞれについて元のリストをテストして、その値が複数回含まれているかどうかを確認しました。すべての重複のリストを返しました。コードの残りの部分は、それが機能することを示すためのデモンストレーションのみを目的としています。

編集:構文の強調表示は、私のdocstringのアポストロフィが気に入らなかった。

于 2012-07-08T19:22:22.967 に答える