2010-07-15 17 views

risposta

33

assumere la lunghezza della stringa è sempre un numero pari,

>>> s = '12345678' 
>>> t = iter(s) 
>>> '-'.join(a+b for a,b in zip(t, t)) 
'12-34-56-78' 

Il t può anche essere eliminato con

>>> '-'.join(a+b for a,b in zip(s[::2], s[1::2])) 
'12-34-56-78' 

L'algoritmo è raggruppare la stringa in coppie, quindi join con il carattere -.

Il codice è scritto in questo modo. Innanzitutto, è diviso in cifre dispari e persino in cifre.

>>> s[::2], s[1::2] 
('1357', '2468') 

Poi the zip function viene usato per combinare in un iterabile di tuple.

>>> list(zip(s[::2], s[1::2])) 
[('1', '2'), ('3', '4'), ('5', '6'), ('7', '8')] 

Ma le tuple non sono quello che vogliamo. Questo dovrebbe essere un elenco di stringhe. Questo è lo scopo della lista di comprensione

>>> [a+b for a,b in zip(s[::2], s[1::2])] 
['12', '34', '56', '78'] 

Infine usiamo str.join() combinare la lista.

>>> '-'.join(a+b for a,b in zip(s[::2], s[1::2])) 
'12-34-56-78' 

Il primo pezzo di codice è la stessa idea, ma consuma meno memoria se la stringa è lunga.

+1

Puoi spiegare la parte zip? Che cosa sta facendo? – root

+0

Cosa succede se la lunghezza di s è dispari? –

+0

@Ham: l'ultimo carattere sarà sparito. – kennytm

29
>>> s = 'aabbccdd' 
>>> '-'.join(s[i:i+2] for i in range(0, len(s), 2)) 
'aa-bb-cc-dd' 
+2

E le sequenze di lunghezza dispari? –

+3

Lo considero più pitone del voodoo con zip nella risposta aproved. Il fatto che tu non abbia bisogno di usare range (len (string)) per i loop in python, non significa che devi andare a inventare cose pazze solo per evitarlo. – jsbueno

+2

@hamish: mantiene l'ultimo carattere inserito e inserisce un trattino davanti ad esso.Non è un comportamento desiderato? – SilentGhost

0

Questo one-liner fa il trucco. Rilascerà l'ultimo carattere se la stringa ha un numero dispari di caratteri.

"-".join([''.join(item) for item in zip(mystring1[::2],mystring1[1::2])]) 
+0

La risposta di SilentGhost è migliore. Ma mi è piaciuto provare lo zippamento ... – chryss

2

Se si desidera conservare l'ultimo carattere se la stringa ha una lunghezza dispari, allora si può modificare la risposta di KennyTM utilizzare itertools.izip_longest:

>>> s = "aabbccd" 
>>> from itertools import izip_longest 
>>> '-'.join(a+b for a,b in izip_longest(s[::2], s[1::2], fillvalue="")) 
'aa-bb-cc-d' 

o

>>> t = iter(s) 
>>> '-'.join(a+b for a,b in izip_longest(t, t, fillvalue="")) 
'aa-bb-cc-d' 
0

Ecco un modo di comprendere una lista con un valore condizionale che dipende dal modulo di enumerazione, l'ultimo carattere dispari sarà nel solo gruppo:

Problemi correlati