Perché è string.join(list) invece di list.join(string)?

Questo mi ha sempre confuso. Sembra che questo sarebbe più bello:

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

che questo:

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

C'è una ragione specifica per cui è così?

Soluzione

È perché qualsiasi iterabile può essere unito, non solo le liste, ma il risultato e il "joiner" sono sempre stringhe.

Per esempio:

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

Perché il metodo join() è nella classe string, invece che nella classe list?

Sono d'accordo che sembra strano.

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

Nota storica. Quando ho imparato per la prima volta Python, mi aspettavo che join fosse un metodo di una lista, che avrebbe preso il delimitatore come argomento. Molte persone la pensano allo stesso modo, e c'è una storia dietro il metodo join. Prima a Python 1.6, le stringhe non avevano tutti tutti questi metodi utili. C'era un modulo separato per le stringhe che conteneva tutte le funzioni di stringa; ogni funzione prendeva una stringa come primo argomento. Le funzioni erano considerate abbastanza importanti da essere messe sulle stringhe stesse, il che aveva senso per funzioni come lower, upper, e split. Ma molti programmatori Python hard-core programmatori hanno obiettato al nuovo join sostenendo che dovrebbe essere un metodo della lista invece, o che non dovrebbe muoversi affatto ma semplicemente rimanere una parte del vecchio modulo stringa (che ha ancora un sacco di roba utile). Io uso esclusivamente il nuovo metodo join, ma vedrete codice scritto in entrambi modo, e se proprio vi da fastidio, potete puoi usare la vecchia funzione string.join invece.

--- Mark Pilgrim, Dive into Python

Commentari (1)

Principalmente perché il risultato di una someString.join() è una stringa.

La sequenza (lista o tupla o altro) non appare nel risultato, solo una stringa. Poiché il risultato è una stringa, ha senso come metodo di una stringa.

Commentari (0)