1

のようなシーケンスが[0, 1, 0, 1, 0, 1, 0]あり、繰り返される隣接するシーケンスのペアを削除し、最初のペアを保持して返す関数が必要[0, 1, 0]です。これらは私が期待するいくつかの結果です。

>>> remove_repeated_pairs([0, 1])
[0, 1]
>>> remove_repeated_pairs([0, 1, 0])
[0, 1, 0]
>>> remove_repeated_pairs([0, 1, 0, 1])
[0, 1]
>>> remove_repeated_pairs([0, 1, 0, 1, 0])
[0, 1, 0]
>>> remove_repeated_pairs([2, 0, 1, 0, 1, 0])
[2, 0, 1, 0]
>>> remove_repeated_pairs([1, 2, 0, 1, 0, 1, 0])
[1, 2, 0, 1, 0]

初版:

私はこのコードを試しました:

def remove_repeated_pairs(seq):
    result = []
    for i in range(0, len(seq), 2):
        if len(result) >= 2:
            last_seq = result[-2:]
        else:
            last_seq = None
        pair = seq[i:i + 2]
        if pair != last_seq:
            result.extend(pair)
    return result

しかし、これでは機能しません:

>>> remove_repeated_pairs([1, 3, 0, 2, 1, 2, 1, 3, 0])
[1, 3, 0, 2, 1, 2, 1, 3, 0]

正しい答えは[1, 3, 0, 2, 1, 3, 0]

4

6 に答える 6

3

この問題は、リストの要素を 2 つずつ (範囲 (0, len(seq), 2) 内の i について) 調べるという事実から来ていると思います。したがって、繰り返されるペアが奇数の場所から始まる場合、あなたは勝ちました。あなたが与える最後の例のように、それを検出しません。

私は次のようなことを試します:

def remove_repeated_pairs(l):
    i = 2;
    while i < len(l)-1:
            if l[i] == l[i-2] and l[i+1]==l[i-1]:
                l.pop(i);
                l.pop(i);
            else:
                i+=1;

    return l;

よろしく、

于 2012-06-17T00:24:36.727 に答える
3

シーケンスだけでなく、任意の iterable で動作するバージョンを次に示します。

def remove_repeated_pairs(iterable):
    it = iter(iterable)
    a = next(it) # always yield the first pair
    yield a
    b = next(it)
    yield b

    c = next(it)
    for d in it:
        if a != c or b != d:
            yield c
            a, b, c = b, c, d # shift by one item
        else: # repeated pair, skip it
            a, b, c = c, d, next(it)
    yield c

>>> list(remove_repeated_pairs([1, 3, 0, 2, 1, 2, 1, 3, 0]))
[1, 3, 0, 2, 1, 3, 0]
于 2012-06-17T01:01:16.677 に答える
1

より簡潔なバージョンは次のとおりです。

def remove_repeated_pairs(seq):
    pairs = zip([-1] + seq,seq)[1:]
    l = [index for (index,pair) in enumerate(pairs) if (index > 1) and
                (pair == pairs[index-2])]
    return [seq[x] for x in range(len(seq)) if x not in l and x+1 not in l ]

print remove_repeated_pairs([1, 3, 0, 2, 1, 2, 1, 3, 0])
#OUTPUT: [1, 3, 0, 2, 1, 3, 0]

print remove_repeated_pairs([1, 2, 4, 1, 4, 1, 3])
#OUTPUT: [1, 2, 4, 1, 3]
于 2012-06-17T01:05:55.907 に答える
0

2つずつではなく1つずつ進む必要があります

def remove_repeated_pairs(l):
     if(len(l) < 4):
         return l
     result = l[:2]
     i = 2
     while i < (len(l)-1):
         if l[i] == result[-2] and l[i+1] == result[-1]:
             i += 2
         else:
             result.append(l[i])
             i += 1
     result += l[i:]
     return result
于 2012-06-17T00:53:56.940 に答える
0

奇数のインデックスで始まるペアもチェックする必要があります。つまり、ペアseq [1:2]はseq [3:4]と等しく、偶数のペアもチェックする必要があります。つまり、seq [0:1]はseq [2:3]と等しくなります。

于 2012-06-17T00:49:13.773 に答える
0
def remove_repeated_pairs(seq):
    ret = [seq[0]]
    s = None
    i = 1
    while i < len(seq)-1:
        pair = (seq[i], seq[i+1])
        if pair != s:
            s = (seq[i-1], seq[i])
            ret.append(seq[i])
        else:
            i+=1
        i+=1
    if i == len(seq)-1:
        ret.append(seq[i])
    return ret    
于 2012-06-17T01:00:33.600 に答える