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 listmetodo, dovresti eseguire il cast di ogni iteratore di stringhe come listprima 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.joindeve 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.joinoperazione è ancora semanticamente un'operazione "stringa", quindi ha ancora senso averla strsull'oggetto piuttosto che su vari oggetti.
-dichiara che stai unendo un elenco e la conversione in una stringa. È orientato ai risultati.