Python: заменить i-й вхождение x на i-й элемент в списке - PullRequest
5 голосов
/ 17 мая 2011


Предположим, у нас есть строка a = "01000111000011" с n=5 "1" с. ith "1", я хотел бы заменить на ith в "ORANGE".Мой результат должен выглядеть так:

b = "0O000RAN0000GE"

Каким может быть лучший способ решить эту проблему в Python?Можно ли привязать индекс к каждой замене?

Большое спасибо!Helga

Ответы [ 5 ]

6 голосов
/ 17 мая 2011

Тонны ответов / способов сделать это.Мой использует фундаментальное предположение, что ваши #of 1s равны длине слова, которое вы заменяете.

a = "01000111000011"
a = a.replace("1", "%s")
b = "ORANGE"
print a % tuple(b)

Или питон 1 вкладыш;)

print "01000111000011".replace("1", "%s") % tuple("ORANGE")
5 голосов
/ 17 мая 2011
a = '01000111000011'
for char in 'ORANGE':
  a = a.replace('1', char, 1)

Или:

b = iter('ORANGE')
a = ''.join(next(b) if i == '1' else i for i in '01000111000011')

Или:

import re
a = re.sub('1', lambda x, b=iter('ORANGE'): b.next(), '01000111000011')
3 голосов
/ 17 мая 2011
s_iter = iter("ORANGE")
"".join(next(s_iter) if c == "1" else c for c in "01000111000011")
0 голосов
/ 17 мая 2011

Улучшение решения bluepnume:

>>> from itertools import chain, repeat
>>> b = chain('ORANGE', repeat(None))
>>> a = ''.join((next(b) or c) if c == '1' else c for c in '010001110000110101')
>>> a
'0O000RAN0000GE0101'

[EDIT]

Или даже проще:

>>> from itertools import chain, repeat
>>> b = chain('ORANGE', repeat('1'))
>>> a = ''.join(next(b) if c == '1' else c for c in '010001110000110101')
>>> a
'0O000RAN0000GE0101'

[РЕДАКТИРОВАТЬ] # 2

Также это работает:

import re
>>> r = 'ORANGE'
>>> s = '010001110000110101'
>>> re.sub('1', lambda _,c=iter(r):next(c), s, len(r))
'0O000RAN0000GE0101'
0 голосов
/ 17 мая 2011

Если число 1 в исходной строке не соответствует длине замещающей строки, вы можете использовать это решение:

def helper(source, replacement):
    i = 0
    for c in source:
        if c == '1' and i < len(replacement):
            yield replacement[i]
            i += 1
        else:
            yield c

a = '010001110001101010101'
b = 'ORANGE'
a = ''.join(helper(a, b)) # => '0O000RAN000GE01010101'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...