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

在Python序列中删除相邻的多个元素,python,sequence,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] >>&g

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

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

关于,

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

关于,

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

您还必须检查从奇数索引开始的对,即对seq[1:2]等于seq[3:4]以及偶数,即seq[0:1]等于seq[2:3]你需要一个接一个地前进,而不是两个接两个地前进

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

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

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

这是一个适用于任意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
实例
这是一个适用于任意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
实例
以下是一个更简洁的版本:

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]

以下是一个更简洁的版本:

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]

你好,罗伯特。我更新了我的问题,尝试了。对于你添加的示例,正确答案是什么?[1,3,0,2,1,3,0]?@J.F.Sebastian,我需要保留[0,1]的第一次出现并删除以下内容。因此,[0,1,0,1,0]应该产生[0,1,0]。@agf,我更新了正确的答案。元素[2,1]重复且相邻。是否只需要删除两个元素模式?还是应该消除任何长度的重复模式?例如,输入[2,0,1,2,0,1]是否应该收缩为[2,0,1]?您好,@robert。我更新了我的问题,尝试了。对于你添加的示例,正确答案是什么?[1,3,0,2,1,3,0]?@J.F.Sebastian,我需要保留[0,1]的第一次出现并删除以下内容。因此,[0,1,0,1,0]应该产生[0,1,0]。@agf,我更新了正确的答案。元素[2,1]重复且相邻。是否只需要删除两个元素模式?还是应该消除任何长度的重复模式?例如,输入[2,0,1,2,0,1]是否应收缩为[2,0,1]?注:L.popi是一个ON操作;它使这个算法在**2上运行,尽管它对小列表来说并不重要。当然,你的版本更有效-反馈的thx注意:L.popi是一个ON操作;它使这个算法在**2上运行,尽管它对小列表来说并不重要。当然,你的版本更有效-thx用于反馈