2011-05-07 5 views

Répondre

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

semble fonctionner

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

Notez que cela ne fonctionne que si tous les éléments et les chaînes sont seperator un seul caractère! – delnan

6

Cela devrait fonctionner avec tous les éléments de la liste:

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

Mieux, et je trouve le meilleur: '' print sum ((['-', i] pour i dans ls), ls [0: 1]) '' – eyquem

+1

La somme des listes est O (n²); c'est rarement une bonne idée. – Veedrac

1

Je pense que cela est un peu plus élégant/pythonique ainsi que d'être général. Vous trouverez peut-être moins lisible si vous n'êtes pas habitué à un style fonctionnel si:

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

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

Si vous le souhaitez, vous pouvez utiliser lambda a, b: a + b au lieu de operator.add.

+0

Tour J'ai eu la même idée mais avec ** li [0: 1] ** comme début: '' reduce (concat, [['-', x] pour x dans li [1:]], li [0: 1]) '' Upvoted – eyquem

+1

Ceci est O (n²); une solution O (n) est facilement possible. – Veedrac

16

Voici une solution que je m'attendrais à être très rapide - Je crois que toutes ces opérations se feront à une vitesse c optimisée.

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

Testés:

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

Cela pourrait être un moyen plus propre pour la première affectation: 'result = [Aucun, élément] * len (lst)' – pabouk

+0

@pabouk, oui cela pourrait fonctionner, même si vous deviez appeler 'pop' à la fin (à obtenez le rouge de l'élément supplémentaire). Je vais le tester quand j'ai l'occasion de voir si c'est plus rapide. – senderle

1

Adaptation 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 utilise à cet effet itertools et une liste de séparation légèrement modifié:

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

Ce qui suit ajoutera un élément « de séparation » entre chacun de ces dans une liste:

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, '-') 

sortie:

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

FWIW, voici un fil similaire intitulé Custom string joining dans le groupe Usenet comp.lang.python qui pourrait intéresser toi.

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

ou

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

ou

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