Waarom is het string.join(lijst) in plaats van list.join(string)?

Dit heeft me altijd verward. Het lijkt alsof dit mooier zou zijn:

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

Dan dit:

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

Is er een specifieke reden waarom het zo is?

Oplossing

Dat komt omdat elke iterable kan worden samengevoegd, niet alleen lijsten, maar het resultaat en de "joiner" zijn altijd strings.

Bijvoorbeeld:

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

Omdat de join() methode in de string klasse zit, in plaats van de list klasse?

Ik ben het ermee eens dat het er grappig uitziet.

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

Historische noot. Toen ik voor het eerst Python leerde, verwachtte ik dat join een methode zou zijn van een lijst zou zijn, die de delimiter als argument zou nemen. Veel mensen denken er ook zo over, en er is een verhaal achter de join methode. Voorafgaand aan voor Python 1.6, hadden strings niet al al deze nuttige methoden. Er was een aparte string module die alle string functies bevatte alle string functies bevatte; elke functie nam een string als zijn eerste argument. De functies werden geacht belangrijk genoeg om op de strings zelf te zetten, wat logisch was... voor functies als lower, upper, en splitsen. Maar veel hard-core Python programmeurs maakten bezwaar tegen de nieuwe join methode, met het argument dat het een methode van de lijst zou moeten zijn, of dat het helemaal niet zou moeten bewegen maar gewoon een deel van de oude string module (die nog steeds veel nuttige dingen in zitten). Ik gebruik de nieuwe join methode exclusief, maar je zult code geschreven zien op beide hoe, en als het je echt stoort, kun je kun je de oude string.join functie gebruiken in plaats daarvan.

--- Mark Pilgrim, Duik in Python

Commentaren (1)

Voornamelijk omdat het resultaat van een someString.join() een string is.

De sequentie (lijst of tuple of wat dan ook) komt niet in het resultaat voor, alleen een string. Omdat het resultaat een string is, is het zinvol als een methode van een string.

Commentaren (0)