2013-04-30 12 views
5

Molti linguaggi di programmazione, tra cui Python, sostenere un'operazione come questa:Semantica di trasformare lista in stringa

", ".join(["1","2","3"]) 

che restituisce la stringa

"1, 2, 3" 

Capisco che questo è il caso, ma io non capisco la decisione di progettazione dietro di esso - sicuramente sarebbe più semanticamente valido eseguire l'operazione join nell'elenco, in questo modo:

["1","2","3"].join(", ") 

Se qualcuno potesse spiegare la decisione di progettazione e far luce su di esso, lo apprezzerei.

Modifica: Sembra che Javascript abbia il metodo join nell'elenco; se qualcuno ha degli esempi per i quali le lingue particolari della convenzione seguono, sentiti libero di commentare/rispondere alla scelta anche in quel particolare linguaggio.

+0

Nota che il tuo esempio * non funziona * in python. L'elenco deve contenere solo stringhe. – mgilson

+0

Gli elenchi sono, in un certo senso, un livello inferiore (più parte fondamentale della) della lingua. quindi le stringhe conoscono le liste, ma gli elenchi non conoscono le stringhe. –

+0

Ho modificato la sintassi per riflettere: la domanda riguardava la semantica generale piuttosto che quella particolare operazione :) – jackweirdy

risposta

3

Per Python, ci sono alcuni argomenti contro di esso. Innanzitutto, se si tratta di un metodo stringa che accetta un iterabile arbitrario, è sufficiente supportare il metodo join sugli oggetti stringa e funziona automagicamente con qualsiasi cosa iterabile. In caso contrario, personalizzati oggetti iterabili avrebbero anche bisogno di sostenere un metodo join, ecc ecc

considerare:

", ".join(["1","2","3"]) 
", ".join(("1","2","3")) 
", ".join(str(x) for x in xrange(1,4)) 
", ".join({'1':None,'2':None,'3':None}) 
", ".join({'1','2','3'}) #set literal syntax -- python2.7+ 
", ".join("123") 

6 tipi diversi, tutti supportati molto semplicemente con un unico metodo (e ho toccato solo incorporato tipi).

In secondo luogo, è possibile solo join un elenco se tutto in esso è un tipo basestring. Sembra sciocco fornire un metodo su una lista che solleverebbe un'eccezione se la usassi su una lista con contenuti sbagliati - Almeno, l'API qui sembra alquanto complicata (per me). Ovviamente, si potrebbe sostenere che list.remove può generare un'eccezione se chiamata con gli argomenti sbagliati. Ed è vero - Ma in generale stai rimuovendo solo un singolo oggetto. Funziona su un livello inferiore rispetto a join dovrebbe. Naturalmente, questo argomento è più debole del primo che ho proposto, quindi se non ti piace, basta ricorrere all'argomento 1.

Problemi correlati