从lis中删除元素和n个以下元素

2024-05-14 23:34:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我想删除列表中的所有元素我想遍历一个列表,跳过与某个测试匹配的元素,以及匹配后一定数量的元素。例如

# skip 'foo' and 2 subsequent values

values = [1, 2, 3, 'foo', 'a', 'b', 6, 7, 'foo', 'x', 'y']

result = [1, 2, 3, 6, 7]

有没有比使用计数器迭代生成新列表并在找到匹配项时跳过n迭代更优雅的方法呢?

^{pr2}$
[1, 2, 3, 6, 7]

Tags: and方法元素列表数量foo计数器result
3条回答

现在,一个协同程序解决方案。在

def countdown(val, count):
  curr = 0
  while True:
    now = (yield curr)
    if curr > 0:
      curr -= 1
    if now == val:
      curr = count

values = [1, 2, 3, 'foo', 'a', 'b', 6, 7, 'foo', 'x', 'y']
c = countdown('foo', 3)
c.next()
print [x for x in values if not c.send(x)]

只是切片删除。在

>>> values = [1, 2, 3, 'foo', 'a', 'b', 6, 7, 'foo', 'x', 'y']
>>> values.index('foo')
3
>>> del values[3:3 + 3]
>>> values.index('foo')
5
>>> del values[5:5 + 3]
>>> values.index('foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 'foo' is not in list
>>> values
[1, 2, 3, 6, 7]

嗯,发电机怎么样?在

def iterskip(iterator, test, n):
    """Iterate skipping values matching test, and n following values"""
    iterator = iter(iterator)
    while 1:
        value = next(iterator)
        if test(value):
            for dummy in range(n):
                next(iterator)
        else:
            yield value

def is_foo(value):
    return value == 'foo'

print list(iterskip(values, is_foo, 2))

相关问题 更多 >

    热门问题