Warum ist es string.join(list)
statt list.join(string)
?
Dies liegt daran, dass join
es 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 list
Methode wäre, müssten Sie jeden solchen Iterator von Strings wie list
zuvor 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.join
muss 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.join
ist 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.join
Operation immer noch semantisch eine "String" -Operation, so dass es immer noch sinnvoll ist, sie auf dem str
Objekt 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.