Convertir una lista en una cadena separada por comas con “y” antes del último elemento – Python 2.7

He creado esta función para analizar la lista:

listy = ['item1', 'item2','item3','item4','item5', 'item6'] def coma(abc): for i in abc[0:-1]: print i+',', print "and " + abc[-1] + '.' coma(listy) #item1, item2, item3, item4, item5, and item6. 

¿Hay una manera más ordenada de lograr esto? Esto debería ser aplicable a listas con cualquier longitud.

Cuando hay elementos de 1+ en la lista (si no, solo usa el primer elemento):

 >>> "{} and {}".format(", ".join(listy[:-1]), listy[-1]) 'item1, item2, item3, item4, item5, and item6' 

Edit: Si necesita una coma de Oxford (¡ni siquiera sabía que existía!), Simplemente use: ", and" isntead.

 def oxford_comma_join(l): if not l: return "" elif len(l) == 1: return l[0] else: return ', '.join(l[:-1]) + ", and " + l[-1] print(oxford_comma_join(['item1', 'item2', 'item3', 'item4', 'item5', 'item6'])) 

Salida:

 item1, item2, item3, item4, item5, and item6 

También como un lado la forma pythonica de escribir.

 for i in abc[0:-1]: 

es

 for i in abc[:-1]: 
 def coma(lst): return '{} and {}'.format(', '.join(lst[:-1]), lst[-1]) 

Una forma más diferente de hacerlo:

 listy = ['item1', 'item2','item3','item4','item5', 'item6'] 

primera forma :

 print(', '.join('and, ' + listy[item] if item == len(listy)-1 else listy[item] for item in xrange(len(listy)))) output >>> item1, item2, item3, item4, item5, and, item6 

segunda forma :

 print(', '.join(item for item in listy[:-1]), 'and', listy[-1]) output >>> (item1, item2, item3, item4, item5, 'and', 'item6') 

Generalmente es una mala práctica usar + cuando se combinan cadenas, ya que generalmente es lento. En su lugar, puedes usar

 def comma(items): return "{}, and {}".format(", ".join(items[:-1]), items[-1]) 

Sin embargo, debe tener en cuenta que esto se interrumpirá si solo tiene un elemento:

 >>> comma(["spam"]) ', and spam' 

Para resolverlo, puede probar la longitud de la lista ( if len(items) >= 2: :), o hacer esto, que (imho) es ligeramente más python:

 def comma(items): start, last = items[:-1], items[-1] if start: return "{}, and {}".format(", ".join(start), last) else: return last 

Como vimos anteriormente, una sola lista de elementos dará como resultado un valor vacío para los items[:-1] . if last: es solo una forma pythonica de verificar si el last está vacío.

En Python, muchas funciones que funcionan con listas también funcionan con iteradores (como join , sum , list ). Obtener el último elemento de un iterable no es tan fácil, porque no puede obtener la longitud, ya que puede ser desconocido de antemano.

 def coma_iter(iterable): sep = '' last = None for next in iterable: if last is not None: yield sep yield last sep = ', ' last = next if sep: yield ', and ' if last is not None: yield last print ''.join(coma_iter(listy)) 

También podría completar las soluciones con un ejemplo recursivo.

 >>> listy = ['item1', 'item2','item3','item4','item5', 'item6'] >>> def foo(a): if len(a) == 1: return ', and ' + a[0] return a[0] + ', ' + foo(a[1:]) >>> foo(listy) 'item1, item2, item3, item4, item5, , and item6' >>> 

También puedes probar la librería quoter

 >>> import quoter >>> mylist = ['a', 'b', 'c'] >>> quoter.and_join(mylist) 'a, b, and c' >>> quoter.or_join(mylist) 'a, b, or c' 

https://pypi.python.org/pypi/quoter