Замена в списках по ключ.словам python

Час добрый. Подскажите пожалуйста как можно переделать код, который оставлю ниже, для замены не всех одинаковых элементов выбранных по ключу, а только, скажем второй

import random

list1 = ['пример', 'пример', '♥♥♥', 'пример', '♥♥']
list2 = ['1', '2', '3', '4', '5', '6', 'текст']
replace = 'пример'

unique2 = sorted(set(list2))
random.shuffle(unique2)
for j, i in enumerate([i for i, e in enumerate(list1) if e == replace]):
    list1[i] = unique2[j % len(unique2)]

print(list1)

То есть чтобы на выходе получить list1 = ['пример', '2','♥♥♥', 'пример', '♥♥'] А не заменить все ключ.слова 'пример' на слова из списка 2


Ответы (2 шт):

Автор решения: strawdog

Ну вот ради эксперимента с itertools:

import itertools
counter = itertools.count(1)

list1 = ['пример', 'пример', '♥♥♥', 'пример', '♥♥']
list2 = ['1', '2', '3', '4', '5', '6', 'текст']
replace = ("пример", 3) #что заменять и какое по счету вхождение

tmp = [(next(counter), x) if x==replace[0] else (0, x) for x in list1 ]
res = [x[1] if x[0]!=replace[1] else list2[replace[1]-1] for x in tmp]

res:

['пример', 'пример', '♥♥♥', '3', '♥♥']
→ Ссылка
Автор решения: SergFSM

немного изменил ваш код (добавил условие), теперь можно указать элементы на каких позициях нужно заменить:

import random

list1 = ['пример', 'пример', '♥♥♥', 'пример', '♥♥']
list2 = ['1', '2', '3', '4', '5', '6', 'текст']
replace_text = 'пример'
replace_pos = [1,2]  # порядковые номера элементов которые надо заменить

unique2 = sorted(set(list2))
random.shuffle(unique2)
for j, i in enumerate([i for i, e in enumerate(list1) if e == replace_text]):
    if j+1 in replace_pos: list1[i] = unique2[j % len(unique2)]

print(list1)  # ['5', '6', '♥♥♥', 'пример', '♥♥']
→ Ссылка