您可以使用列表推导获取Banana 的所有索引,然后切片以获取这些索引中的每一秒,然后将相应的列表项设置为Pear:
>>> l = ['Banana', 'Apple', 'John', 'Banana', 'Food', 'Banana']
>>> for idx in [idx for idx, name in enumerate(l) if name == 'Banana'][::2]:
... l[idx] = 'Pear'
>>> l
['Pear', 'Apple', 'John', 'Banana', 'Food', 'Pear']
您也可以使用生成器表达式和itertools.islice,而不是理解和切片:
>>> from itertools import islice
>>> l = ['Banana', 'Apple', 'John', 'Banana', 'Food', 'Banana']
>>> for idx in islice((idx for idx, name in enumerate(l) if name == 'Banana'), None, None, 2):
... l[idx] = 'Pear'
>>> l
['Pear', 'Apple', 'John', 'Banana', 'Food', 'Pear']
另一种可能性,特别是如果您不想就地更改列表,则可以创建自己的生成器函数:
def replace_every_second(inp, needle, repl):
cnt = 0
for item in inp:
if item == needle: # is it a match?
if cnt % 2 == 0: # is it a second occurence?
yield repl
else:
yield item
cnt += 1 # always increase the counter
else:
yield item
>>> l = ['Banana', 'Apple', 'John', 'Banana', 'Food', 'Banana']
>>> list(replace_every_second(l, 'Banana', 'Pear'))
['Pear', 'Apple', 'John', 'Banana', 'Food', 'Pear']