在Python序列中删除相邻的多个元素

时间:2012-06-16 23:44:34

标签: python sequence

我有一个类似[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]

6 个答案:

答案 0 :(得分:3)

我认为这个问题来自这样一个事实,即您将2列表中的元素(对于范围内的i(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;

此致

答案 1 :(得分: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]

答案 2 :(得分: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]

答案 3 :(得分:0)

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

答案 4 :(得分: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

答案 5 :(得分: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