2016-07-08 84 views
6

so cheCome ripetere singoli caratteri in stringhe in Python

"123abc" * 2 

valutata come "123abc123abc", ma c'è un modo semplice per ripetere singole lettere N volte, per esempio convertire "123abc" in "112233aabbcc" o "111222333aaabbbccc"?

+0

Provare a utilizzare un ciclo for e concatenare i caratteri per ottenere l'output desiderato. – dazzieta

risposta

16

Che dire:

>>> s = '123abc' 
>>> n = 3 
>>> ''.join([char*n for char in s]) 
'111222333aaabbbccc' 
>>> 

(cambiato in un elenco comp da un generatore di espressione come utilizzando una lista all'interno bozzetto join è faster)

+1

ah, mi piace usare la comprensione, stavo avendo un crampo al cervello per qualche motivo. –

4

Un'opzione itertools-overcomplicating stile -problema alternativo con repeat() , izip() e chain():

>>> from itertools import repeat, izip, chain 
>>> "".join(chain(*izip(*repeat(s, 2)))) 
'112233aabbcc' 
>>> "".join(chain(*izip(*repeat(s, 3)))) 
'111222333aaabbbccc' 

O, "io so r egexes e lo userò tutto "opzione di stile per i:

>>> import re 
>>> n = 2 
>>> re.sub(".", lambda x: x.group() * n, s) # or re.sub('(.)', r'\1' * n, s) - thanks Eduardo 
'112233aabbcc' 

Naturalmente, non utilizzare queste soluzioni nella pratica.

1

Se si desidera ripetere singole lettere, è sufficiente sostituire la lettera con n lettere, ad es.

>>> s = 'abcde' 
>>> s.replace('b', 'b'*5, 1) 
'abbbbbcde' 
1

@ risposta di Bahrom è probabilmente più chiara della mia, ma solo per dire che ci sono molte soluzioni a questo problema:

>>> s = '123abc' 
>>> n = 3 
>>> reduce(lambda s0, c: s0 + c*n, s, "") 
'111222333aaabbbccc' 

noti che reduce non è un built-in in Python 3, e devi invece usare functools.reduce.

1

o utilizzando le espressioni regolari:

>>> import re 
>>> s = '123abc' 
>>> n = 3 
>>> re.sub('(.)', r'\1' * n, s) 
'111222333aaabbbccc' 
1

Un altro modo:

def letter_repeater(n, string): 
    word = '' 
    for char in list(string): 
     word += char * n 
    print word 

letter_repeater(4, 'monkeys') 


mmmmoooonnnnkkkkeeeeyyyyssss 
+0

sì, questo è l'ovvio modo imperativo, ho pensato che ci fosse qualcosa di più Pythonic però. (Suggerirei 'return word' piuttosto che' print word' a proposito) –

+0

@JasonS, penso che le altre opzioni fornite siano più pitoni, ma il lavoro è fatto. E concordato sul 'return' vs.' print', ho pensato che sarebbe stato più rapido ottenere il punto su – af3ld

+1

p.s. anche non è necessario usare 'list (string)' - le stringhe sono già iterabili. (E ti ho fatto un voto inverso!) –

2

E dato che io uso NumPy per tutto, qui andiamo:

import numpy as np 
n = 4 
''.join(np.array(list(st*n)).reshape(n, -1).T.ravel()) 
3

Or un altro modo per farlo sarebbe noi ing map:

"".join(map(lambda x: x*7, "map"))