Warum ist es string.join(list)statt list.join(string)?
Dies liegt daran, dass joines sich um eine "String" -Methode handelt! Es wird eine Zeichenfolge aus einer beliebigen iterierbaren Zeichenfolge erstellt. Wenn wir die Methode auf Listen setzen, was ist dann, wenn wir Iterables haben, die keine Listen sind?
Was ist, wenn Sie ein Tupel von Zeichenfolgen haben? Wenn dies eine listMethode wäre, müssten Sie jeden solchen Iterator von Strings wie listzuvor umwandeln, bevor Sie die Elemente zu einem einzigen String zusammenfügen könnten! Zum Beispiel:
some_strings = ('foo', 'bar', 'baz')
Lassen Sie uns unsere eigene List Join-Methode rollen:
class OurList(list):
def join(self, s):
return s.join(self)
Um es zu verwenden, müssen Sie zuerst eine Liste aus jeder Iterable erstellen, um die Zeichenfolgen in dieser Iterable zu verknüpfen, wodurch sowohl Speicher als auch Verarbeitungsleistung verschwendet werden:
>>> l = OurList(some_strings) # step 1, create our list
>>> l.join(', ') # step 2, use our list join method!
'foo, bar, baz'
Wir müssen also einen zusätzlichen Schritt hinzufügen, um unsere Listenmethode zu verwenden, anstatt nur die integrierte String-Methode zu verwenden:
>>> ' | '.join(some_strings) # a single step!
'foo | bar | baz'
Leistungsbeschränkung für Generatoren
Der Algorithmus, mit dem Python die endgültige Zeichenfolge erstellt, str.joinmuss die iterierbare Zeichenfolge tatsächlich zweimal durchlaufen. Wenn Sie ihm also einen Generatorausdruck bereitstellen, muss er zuerst in einer Liste materialisiert werden, bevor die endgültige Zeichenfolge erstellt werden kann.
Während das Weitergeben von Generatoren normalerweise besser ist als das Listenverständnis, str.joinist dies eine Ausnahme:
>>> 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
Trotzdem ist die str.joinOperation immer noch semantisch eine "String" -Operation, so dass es immer noch sinnvoll ist, sie auf dem strObjekt zu haben als auf verschiedenen iterablen.
-Erklärt zum einfachen Speichern und Verstehen, dass Sie einer Liste beitreten und in eine Zeichenfolge konvertieren. Sie ist ergebnisorientiert.