2012-11-04 3 views

Répondre

2

est ici une idée:

import itertools 

a = [[1, 2, 3], [4, 5, 6]] 
filler = ['cat'] 
print list(itertools.chain.from_iterable(zip(a, [filler] * len(a)))) 

Sortie:

[[1, 2, 3], ['cat'], [4, 5, 6], ['cat']] 
+0

'itertools.chain' est la façon canonique d'aplatir, plutôt que de créer votre propre jointure. – Marcin

+0

@Marcin Bon point - voir éditer. – arshajii

2

Pas pythonique mais semble fonctionner.

list = [[1, 2, 3], [4, 5, 6]] 
result = [] 
for e in list: 
    result.append(e) 
    result.append(['cat']) 
result.pop() 

Trouvé à ce poste: Add an item between each item already in the list

+0

J'ai vu ce message, mais tous ces exemples me renvoient des messages d'erreur. –

+0

Quelle erreur avez-vous eu? – cwoebker

0
a = [[1, 2, 3], [4, 5, 6]] 
filler = ['cat'] 
out = [] 

for i in a: 
    out.append(i) 
    out.append(filler) 
0
result = [si for i in zip(a, [filler]*len(a)) for si in i] 
+0

-1 compréhension de liste cryptée utilisée pour aplatir sans explication. Il y a une fonction de bibliothèque parfaitement bonne pour obtenir le même effet. – Marcin

+1

+1, car je ne pense pas qu'il soit toujours nécessaire d'importer un module pour une transformation simple et unique comme celle-ci. _But_ - Je le diviserais en deux lignes séparées. 'paires = zip (a, [remplissage] * len (a)); chained_pairs = [item pour paire par paire pour item dans la paire] '. C'est plus auto-documenté de cette façon. – senderle

3

Je préfère itertools utiliser pour des trucs comme ça:

>>> import itertools as it 
>>> a = [[1, 2, 3], [4, 5, 6]] 
>>> filler = ['cat'] 
>>> list(it.chain.from_iterable(it.izip(a, it.repeat(filler)))) 
[[1, 2, 3], ['cat'], [4, 5, 6], ['cat']] 
0

Essayez ceci, comme une doublure:

from operator import add 
a = [[1, 2, 3], [4, 5, 6]] 
filler = ['cat'] 

reduce(add, ([x, filler] for x in a)) 
> [[1, 2, 3], ['cat'], [4, 5, 6], ['cat']] 

Ou encore plus simple, sans utiliser reduce:

sum(([x, filler] for x in a), []) 
> [[1, 2, 3], ['cat'], [4, 5, 6], ['cat']] 

Les deux solutions font la même chose: d'abord, créez un générateur de [element, filler] et ensuite aplatissez le flux de paires résultant. Pour l'efficacité, la première étape est réalisée en utilisant des générateurs pour éviter les listes intermédiaires inutiles.

MISE À JOUR:

Ce poste est un exemple de manuel de savoir pourquoi un troll ne doit pas être alimenté dans un forum en ligne. Voir les commentaires pour voir ce que je veux dire. Il vaut mieux ignorer le troll.

1

quelque chose comme ceci en utilisant itertools.islice() et itertools.cycle():

cycle() est utilisé pour répéter un élément, et utilisé islice() réduire le nombre de repeatation à len(a), puis utilisez izip() ou simples zip() sur a et l'itérateur retourné par islice() , cela retournera la liste des tuples. Vous pouvez ensuite l'aplatir en utilisant itertools.chain().

In [72]: a 
Out[72]: [[1, 2, 3], [4, 5, 6]] 

In [73]: b 
Out[73]: ['cat'] 

In [74]: cyc=islice(cycle(b),len(a)) 

In [75]: lis=[] 

In [76]: for x in a: 
    lis.append(x) 
    lis.append([next(cyc)]) 
    ....:  

In [77]: lis 
Out[77]: [[1, 2, 3], ['cat'], [4, 5, 6], ['cat']] 

ou:

In [108]: a 
Out[108]: [[1, 2, 3], [4, 5, 6]] 

In [109]: b 
Out[109]: ['cat'] 

In [110]: cyc=islice(cycle(b),len(a)) 

In [111]: list(chain(*[(x,[y]) for x,y in izip(a,cyc)])) 
Out[111]: [[1, 2, 3], ['cat'], [4, 5, 6], ['cat']] 
+0

Pourquoi ne pas simplement utiliser aplatir pour la jonction? – Marcin

+0

pourquoi le -1, la réponse est-elle incorrecte? –

+0

Il est incorrect en ce que (a) ce n'est pas particulièrement bien écrit; et (b) il ne parvient pas à saisir les avantages des itérateurs ou des itérations explicites en les bastardisant. – Marcin

3

J'aime les itertools solutions à base affichées ici, mais voici une approche qui ne nécessite pas de liste ou compréhensions itertools, et je parie que c'est super rapide.

new_list = [filler] * (len(a) * 2) 
new_list[0::2] = a 
+0

C'est environ trois fois plus rapide que l'approche 'itertools'. – Fury

-1
python 3.2 

    a = [[1, 2, 3], [4, 5, 6]] 
    b = ['cat'] 
    _=[a.insert(x,b) for x in range(1,len(a)*2,2)] 
Questions connexes