2011-05-17 64 views
5


假设我们有一个字符串a = "01000111000011"n=5 "1" s。 第i个"1",我想用"ORANGE"中的个字符替换。 我的结果应该是这样的:Python:用列表中的第i个元素替换x的出现次数

b = "0O000RAN0000GE" 

什么可以解决在Python这个问题的最好方法是什么?是否有可能绑定索引到每个替代?

非常感谢! 海尔格

回答

6

吨。我使用一个基本的假设,即你的#的1s等于你所代入的单词的长度。

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

还是Python的1个衬垫;)

print "01000111000011".replace("1", "%s") % tuple("ORANGE") 
+0

我喜欢那一行 – utdemir 2011-05-17 16:27:02

5
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') 
+0

这个答案的第一部分,而明确的,具有可怕的表现。如果此任务需要为多个字符串完成,则不应使用它。 – 2011-05-17 17:16:49

+0

如果原始字符串中的1多于替换字符中的1(请参阅'010001110000110101010101'),此答案的第二部分将会出现问题。 – 2011-05-17 17:26:44

3
s_iter = iter("ORANGE") 
"".join(next(s_iter) if c == "1" else c for c in "01000111000011") 
+0

如果原始字符串中的字符数多于替换字符中的字符数(请参阅'010001110000110101010101'),此答案将会出现问题。 – 2011-05-17 17:27:22

0

如果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' 
0

提高对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' 

[编辑]

或者更简单:

>>> 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'