2011-05-17 15 views
5


n=5 "1" s ile a = "01000111000011" dizgisi olduğunu varsayalım. ith"1", numaralı telefondan ith karakteriyle değiştirmek istiyorum. gibi Benim sonuç görünmelidir:Python: ith öğesiyle birlikte x'in yerini değiştirin.

b = "0O000RAN0000GE" 

Ne Python bu sorunu çözmek için en iyi yol olabilir? Her ikame için bir indeksi bağlamak mümkün mü?

Çok teşekkürler! Helga

cevap

6

ton. Benimki, #of 1s 'inizin, aldığınız kelimenin uzunluğuna eşit olduğu konusunda temel bir varsayım kullanır.

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

Ya pythonic 1 astar

;)

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

O tek lineli seviyorum – utdemir

5
a = '01000111000011' 
for char in 'ORANGE': 
    a = a.replace('1', char, 1) 

Veya:

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

Veya: bunu yapmak için cevaplar/yollardan

import re 
a = re.sub('1', lambda x, b=iter('ORANGE'): b.next(), '01000111000011') 
+0

bu cevabın ilk bölümü, korkunç performans. Bu görevin birden fazla dizi için yapılması gerekiyorsa kullanılmamalıdır. –

+0

Bu yanıtın ikinci kısmı, orjinal dizede, yedek karakterlerden daha fazla 1 varsa sorunlara yol açacaktır ('010001110000110101010101' ile çözümü deneyin). –

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

Bu yanıt, orijinal dizede, yedek karakterlerden daha fazla 1 varsa sorunlara yol açacaktır ('010001110000110101010101' ile çözümü deneyin). –

0

kaynak dizede 1'ler sayısı, yedek dize uzunluğunu uymuyorsa bu çözümü kullanabilirsiniz:

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 çözümüne bağlı artırma:

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

[DÜZENLE]

Veya daha da basit:

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

[DÜZENLE] 2.

Ayrıca, bu çalışır: açık iken, sahip

import re 
>>> r = 'ORANGE' 
>>> s = '010001110000110101' 
>>> re.sub('1', lambda _,c=iter(r):next(c), s, len(r)) 
'0O000RAN0000GE0101' 
İlgili konular