Если неважно, какой экземпляр вы оставите, вы можете использовать str.replace
, который принимает параметр, обозначающий количество замен, которые вы хотите выполнить:
def leave_one_last(source, to_remove):
return source.replace(to_remove, '', source.count(to_remove) - 1)
Это оставит последнее вхождение.
Мы можем изменить его, чтобы оставить вхождение first , дважды изменив строку:
def leave_one_first(source, to_remove):
return source[::-1].replace(to_remove, '', source.count(to_remove) - 1)[::-1]
Однако, это уродливо, но неупомянуть неэффективно.Более элегантный способ может заключаться в том, чтобы взять подстроку, которая заканчивается первым вхождением символа, найти, заменить его вхождения в остальных и, наконец, объединить их вместе:
def leave_one_first_v2(source, to_remove):
first_index = source.index(to_remove) + 1
return source[:first_index] + source[first_index:].replace(to_remove, '')
Если мы попробуем это:
string = "a b c d e f g g g g g h i j k l g"
print(leave_one_last(string, 'g'))
print(leave_one_first(string, 'g'))
print(leave_one_first_v2(string, 'g'))
Вывод:
a b c d e f h i j k l g
a b c d e f g h i j k l
a b c d e f g h i j k l
Если вы не хотите оставлять пробелы, вам следует использовать версию на основе split
:
def leave_one_split(source, to_remove):
chars = source.split()
first_index = chars.index(to_remove) + 1
return ' '.join(chars[:first_index] + [char for char in chars[first_index:] if char != to_remove])
string = "a b c d e f g g g g g h i j k l g"
print(leave_one_split(string, 'g'))
Вывод:
'a b c d e f g h i j k l'