('{}, '*(len(authors)-2) + '{} & '*(len(authors)>1) + '{}').format(*authors)
Questa soluzione in grado di gestire un elenco di autori di lunghezza> 0, anche se può essere modificato per gestire anche liste di lunghezza 0. L'idea è di creare prima una stringa di formato che possiamo formattare dalla lista di disimballaggio. Questa soluzione evita di affettare l'elenco in modo che dovrebbe essere abbastanza efficiente per grandi elenchi di autori.
Per prima cosa concateniamo '{}, '
per ogni autore aggiuntivo oltre a due autori. Quindi concateniamo '{} & '
se ci sono due o più autori. Infine aggiungiamo '{}'
per l'ultimo autore, ma questa sottoespressione può essere '{}'*(len(authors)>0)
se vogliamo essere in grado di gestire una lista vuota di autori. Infine, formiamo la stringa completata disimballando gli elementi dell'elenco utilizzando la sintassi di decompressione *
.
Se non è necessario un solo liner, questo è il codice in una funzione efficiente.
def format_authors(authors):
n = len(authors)
if n > 1:
return ('{}, '*(n-2) + '{} & {}').format(*authors)
elif n > 0:
return authors[0]
else:
return ''
Questo può gestire un elenco di autori di qualsiasi lunghezza.
mi piace! Non ho pensato di provare solo con una stringa di formattazione. Non sono sicuro che avrei saputo da dove cominciare. –
@DougR. Bene, l'idea è di sedersi e pensare alle formule matematiche. Vogliamo solo la e commerciale se la lunghezza degli autori è maggiore di 1. Vogliamo solo 1 separatore di virgola per ogni autore maggiore di 2. È grazioso perché ''anystring' * 0' è solo la stringa vuota. – Shashank
Ho un'altra domanda. Questo metodo può essere adattato per inserire una virgola prima della e commerciale per un elenco di lunghezza * n *, dove * n> 2 *? Io, "Jim, ** Jack, ** e John." Questo non viene chiesto come un "pasticcio", ma come una domanda genuina, come la maggior parte dei manuali di stile americano lo impongono. Francamente, non vedo un modo per farlo senza girare 'if n> 1: ...' in 'if n> 2: .../elif n> 1: ...', e ciò sembra sbagliato in qualche modo a fare una soluzione così elegante. Grazie! –