Warum heißt es string.join(list) und nicht list.join(string)?

Das hat mich schon immer verwirrt. Es scheint so, als ob dies schöner wäre:

my_list = ["Hello", "world"]
print(my_list.join("-"))
# Produce: "Hello-world"

als dies:

my_list = ["Hello", "world"]
print("-".join(my_list))
# Produce: "Hello-world"

Gibt es einen bestimmten Grund, warum das so ist?

Lösung

Das liegt daran, dass jede beliebige Iterable verknüpft werden kann, nicht nur Listen, aber das Ergebnis und der "Joiner" sind immer Strings.

Zum Beispiel:

import urllib2
print('\n############\n'.join(
    urllib2.urlopen('http://data.stackexchange.com/users/7095')))
Kommentare (11)

Weil die Methode join() in der String-Klasse und nicht in der List-Klasse liegt?

Ich stimme zu, dass es komisch aussieht.

Siehe http://www.faqs.org/docs/diveintopython/odbchelper_join.html:

Historische Anmerkung Als ich das erste Mal Python gelernt habe, habe ich erwartet, dass join eine Methode einer Liste, die das Begrenzungszeichen als Argument nimmt. Viele Leuten geht es genauso, und es gibt eine Geschichte hinter der join-Methode. Vor Python 1.6 hatten Strings nicht alle diese nützlichen Methoden. Es gab ein separates String-Modul, das alle String-Funktionen enthielt; jede Funktion nahm eine Zeichenkette als erstes Argument. Die Funktionen wurden als wichtig genug, um sie in die Zeichenketten selbst zu legen, was sinnvoll war für Funktionen wie lower, upper und split. Aber viele hartgesottene Python Programmierer lehnten die neue join Methode und argumentierten, dass sie stattdessen eine Methode der Liste sein sollte, oder dass sie überhaupt nicht verschoben werden sollte, sondern einfach Teil des alten String-Moduls bleiben sollte (das immer noch eine Menge nützlicher Dinge enthält). Ich verwende ausschließlich die neue join-Methode, aber Sie werden Code sehen, der auf beide und wenn es Sie wirklich stört, können Sie können Sie die alte Funktion string.join verwenden stattdessen verwenden.

--- Mark Pilgrim, Eintauchen in Python

Kommentare (1)

In erster Linie, weil das Ergebnis von someString.join() eine Zeichenkette ist.

Die Sequenz (Liste oder Tupel oder was auch immer) erscheint nicht im Ergebnis, nur eine Zeichenkette. Weil das Ergebnis eine Zeichenkette ist, macht es Sinn als eine Methode einer Zeichenkette.

Kommentare (0)