你可以使用一个列表COMPR ehension得到的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']
有没有办法做到这一点没有“特殊”自动替换命令? –
@JohnWinston是的,我添加了一个使用生成器函数的解决方案。不知道这是你的意思,但它的工作原理,并不能取代原来的。 :) – MSeifert
thx的答案,顺便说一句'yield'和'cnt'做什么? –