删除列表中的某些连续重复项

use*_*952 4 python list duplicates

我有一个像这样的字符串列表:

['**', 'foo', '*', 'bar', 'bar', '**', '**', 'baz']
Run Code Online (Sandbox Code Playgroud)

我想'**', '**'用一个替换'**',但'bar', 'bar'保持完整.即用一个连续替换任何连续数字'**'.我当前的代码如下所示:

p = ['**', 'foo', '*', 'bar', 'bar', '**', '**', 'baz']
np = [p[0]]
for pi in range(1,len(p)):
  if p[pi] == '**' and np[-1] == '**':
    continue
  np.append(p[pi])
Run Code Online (Sandbox Code Playgroud)

有没有更多的pythonic方式来做到这一点?

sen*_*rle 5

不确定pythonic,但这应该工作,更简洁:

star_list = ['**', 'foo', '*', 'bar', 'bar', '**', '**', 'baz']
star_list = [i for i, next_i in zip(star_list, star_list[1:] + [None]) 
             if (i, next_i) != ('**', '**')]
Run Code Online (Sandbox Code Playgroud)

以上复制列表两次; 如果你想避免这种情况,请考虑Tom Zych的方法.或者,您可以执行以下操作:

from itertools import islice, izip, chain

star_list = ['**', 'foo', '*', 'bar', 'bar', '**', '**', 'baz']
sl_shift = chain(islice(star_list, 1, None), [None])
star_list = [i for i, next_i in izip(star_list, sl_shift) 
             if (i, next_i) != ('**', '**')]
Run Code Online (Sandbox Code Playgroud)

这可以推广并使迭代器更友好 - 更不用说更具可读性 - 使用文档中的pairwise配方变体itertools:

from itertools import islice, izip, chain, tee
def compress(seq, x):
    seq, shift = tee(seq)
    shift = chain(islice(shift, 1, None), (object(),))
    return (i for i, j in izip(seq, shift) if (i, j) != (x, x))
Run Code Online (Sandbox Code Playgroud)

测试:

>>> list(compress(star_list, '**'))
['**', 'foo', '*', 'bar', 'bar', '**', 'baz']
Run Code Online (Sandbox Code Playgroud)