2011-05-07 12 views

Respuesta

7
list = ['a', 'b', 'c', 'd', 'e'] 
result = [] 
for e in list: 
    result.append(e) 
    result.append('-') 
result.pop() 

parece funcionar

15
>>> list('-'.join(ls)) 
['a', '-', 'b', '-', 'c', '-', 'd', '-', 'e'] 
>>> 
+19

Tenga en cuenta que esto sólo funciona si todos los artículos y el separador son cadenas de un solo carácter! – delnan

6

Esto debería funcionar con cualquier elemento de la lista:

>>> sep = '-' 
>>> ls = [1, 2, 13, 14] 
>>> sum([[i, '-'] for i in ls], [])[:-1] 
[1, '-', 2, '-', 13, '-', 14] 
+0

Mejor, y encuentro lo mejor: '' print sum ((['-', i] para i en ls), ls [0: 1]) '' – eyquem

+1

La suma de listas es O (n²); rara vez es una buena idea. – Veedrac

1

Creo que esto es un poco más elegante/Pythonic además de ser general. Puede que le resulte menos legible si usted no está acostumbrado a un estilo funcional sin embargo:

li = ['a','b','c','d','e'] 

from operator import add 
reduce(add, [(elt, "-") for elt in li])[:-1] 

Si se quiere, se puede utilizar lambda a, b: a + b en lugar de operator.add.

+0

Tower Tenía la misma idea pero con ** li [0: 1] ** como inicio: '' reduce (concat, [['-', x] para x en li [1:]], li [0: 1]) '' Upvoted – eyquem

+1

Esto es O (n²); una solución de O (n) es fácilmente posible. – Veedrac

16

Aquí hay una solución que esperaría que fuera muy rápida: creo que todas estas operaciones ocurrirán a una velocidad c optimizada.

def intersperse(lst, item): 
    result = [item] * (len(lst) * 2 - 1) 
    result[0::2] = lst 
    return result 

probados:

>>> l = [1, 2, 3, 4, 5] 
>>> intersperse(l, '-') 
[1, '-', 2, '-', 3, '-', 4, '-', 5] 
+0

Esta podría ser una forma más limpia para la primera asignación: 'result = [None, item] * len (lst)' – pabouk

+0

@pabouk, sí, eso podría funcionar, aunque tendrías que llamar 'pop' al final (a obtener rojo del 'elemento' extra). Lo probaré cuando tenga la oportunidad de ver si es más rápido. – senderle

1

Adaptación this answer to a similar question:

>>> input = ['a', 'b', 'c', 'd', 'e'] 
>>> sep = ['-'] * len(input) 
>>> list(sum(zip(input, sep),())[:-1]) 
['a', '-', 'b', '-', 'c', '-', 'd', '-', 'e'] 

Another answer to the same question hace utilizando itertools y un separador de listas ligeramente modificado:

>>> import itertools 
>>> sep = ['-'] * (len(input) - 1) 
>>> list(it.next() for it in itertools.cycle((iter(input), iter(sep)))) 
['a', '-', 'b', '-', 'c', '-', 'd', '-', 'e'] 
1

La siguiente añadirá un elemento de "separador" entre cada uno de los de una lista:

seq = ['a','b','c','d','e'] 

def tween(seq, sep): 
    return reduce(lambda r,v: r+[sep,v], seq[1:], seq[:1]) 

print tween(seq, '-') 

salida:

['a', '-', 'b', '-', 'c', '-', 'd', '-', 'e'] 

Fwiw, aquí hay un hilo similares titulado Custom string joining en el comp.lang.python grupo Usenet que pueda interesar tú.

2
li = ['a','b','c','d','e'] 
for i in xrange(len(li)-1,0,-1): 
    li[i:i] = '-' 

o

from operator import concat 
seq = ['a','b','c','d','e'] 
print reduce(concat,[['-',x] for x in seq[1:]],seq[0:1]) 

o

li = ['a','b','c','d','e'] 
newli = li[0:1] 
[ newli.extend(('-',x)) for x in li[1:]] 
Cuestiones relacionadas