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.
Puoi spiegare la parte zip? Che cosa sta facendo? – root
Cosa succede se la lunghezza di s è dispari? –
@Ham: l'ultimo carattere sarà sparito. – kennytm