Dire que j'ai une liste comme ceci:Insertion d'un élément après chaque élément dans une liste (Python)
a = [[1, 2, 3], [4, 5, 6]]
filler = ['cat']
Comment pourrais-je obtenir
b = [[1 ,2 ,3], ['cat'], [4, 5, 6], ['cat']]
En sortie?
Dire que j'ai une liste comme ceci:Insertion d'un élément après chaque élément dans une liste (Python)
a = [[1, 2, 3], [4, 5, 6]]
filler = ['cat']
Comment pourrais-je obtenir
b = [[1 ,2 ,3], ['cat'], [4, 5, 6], ['cat']]
En sortie?
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']]
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
J'ai vu ce message, mais tous ces exemples me renvoient des messages d'erreur. –
Quelle erreur avez-vous eu? – cwoebker
a = [[1, 2, 3], [4, 5, 6]]
filler = ['cat']
out = []
for i in a:
out.append(i)
out.append(filler)
result = [si for i in zip(a, [filler]*len(a)) for si in i]
-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, 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
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']]
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.
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']]
Pourquoi ne pas simplement utiliser aplatir pour la jonction? – Marcin
pourquoi le -1, la réponse est-elle incorrecte? –
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
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
C'est environ trois fois plus rapide que l'approche 'itertools'. – Fury
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)]
connexes, mais je suppose que non _quite_ un double: [Ajouter un élément entre chaque élément déjà dans la liste] (http://stackoverflow.com/q/5920643/577088). – senderle