Perché string.join(list)
invece di list.join(string)
?
Questo perché join
è un metodo "stringa"! Crea una stringa da qualsiasi iterabile. Se abbiamo bloccato il metodo sugli elenchi, che dire di quando abbiamo iterabili che non sono elenchi?
E se hai una tupla di stringhe? Se questo fosse un list
metodo, dovresti eseguire il cast di ogni iteratore di stringhe come list
prima di poter unire gli elementi in un'unica stringa! Per esempio:
some_strings = ('foo', 'bar', 'baz')
Tiriamo il nostro metodo di join elenco:
class OurList(list):
def join(self, s):
return s.join(self)
E per usarlo, nota che dobbiamo prima creare un elenco da ogni iterabile per unire le stringhe in quell'iterabile, sprecando sia la memoria che la potenza di elaborazione:
>>> l = OurList(some_strings) # step 1, create our list
>>> l.join(', ') # step 2, use our list join method!
'foo, bar, baz'
Quindi vediamo che dobbiamo aggiungere un ulteriore passaggio per usare il nostro metodo list, invece di usare semplicemente il metodo stringa incorporato:
>>> ' | '.join(some_strings) # a single step!
'foo | bar | baz'
Avvertenza sulle prestazioni per i generatori
L'algoritmo utilizzato da Python per creare la stringa finale str.join
deve in realtà passare due volte sull'iterabile, quindi se si fornisce un'espressione di generatore, deve materializzarla in un elenco prima di poter creare la stringa finale.
Pertanto, mentre passare in giro per i generatori di solito è meglio della comprensione dell'elenco, str.join
è un'eccezione:
>>> import timeit
>>> min(timeit.repeat(lambda: ''.join(str(i) for i in range(10) if i)))
3.839168446022086
>>> min(timeit.repeat(lambda: ''.join([str(i) for i in range(10) if i])))
3.339879313018173
Tuttavia, l' str.join
operazione è ancora semanticamente un'operazione "stringa", quindi ha ancora senso averla str
sull'oggetto piuttosto che su vari oggetti.
-
dichiara che stai unendo un elenco e la conversione in una stringa. È orientato ai risultati.