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'