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(对于 i in range(0, len(seq), 2)。因此,如果重复的对从一个奇怪的地方开始,您就赢了'不要检测到它 - 就像你给出的最后一个例子一样。

我会尝试类似的东西:

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

这是适用于任意可迭代的版本,而不仅仅是序列:

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

您还必须检查从奇数索引开始的对,即对 seq[1:2] 等于 seq[3:4] 以及偶数,即 seq[0:1] 等于 seq[2:3]

于 2012-06-17T00:49:13.773 回答
0

您需要一个接一个地前进,而不是两个接一个地前进

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
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 回答