あなたは、リストCOMPRを使用することができますBanana
のすべてのインデックスを取得するehensionし、これらの指標の毎秒を取得してからちょうど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うん、私はジェネレータ関数を使って1つのソリューションを追加しました。それがあなたが意味するものなのかどうかは分かりませんが、それは動作していて元のものに取って代わりません。 :) – MSeifert
答えのためのthx、btw 'yield'と 'cnt'は何をするのですか? –