Insérer un élément dans la liste Python après chaque nième élément
Dire que j'ai une liste Python comme ceci:
letters = ['a','b','c','d','e','f','g','h','i','j']
Je veux insérer un " x " après chaque nième élément, disons trois personnages dans cette liste. Le résultat devrait être:
letters = ['a','b','c','x','d','e','f','x','g','h','i','x','j']
Je comprends que je peux le faire avec le bouclage et de l'insertion. Ce que je suis à la recherche de est un Pythonish-chemin, un one-liner peut-être?
InformationsquelleAutor Hasan Iqbal | 2015-06-25
Vous devez vous connecter pour publier un commentaire.
J'en ai deux revêtements un.
Donné:
Utilisation
enumerate
pour obtenir l'index, ajoutez'x'
chaque 3rd la lettre, par exemple:mod(n, 3) == 2
, puis concaténer en chaîne etlist()
il.Mais comme @sancho.s souligne cela ne fonctionne pas si l'un des éléments de plus d'une lettre.
Imbriquer des compréhensions pour aplatir une liste de listesa, coupés en groupes de 3 avec
'x'
ajouté si moins de 3 à partir de la fin de la liste.(a)
[item for subgroup in groups for item in subgroup]
aplatit dentelés liste de listes.Essayer cette
où
n
est après combien d'éléments que vous souhaitez insérer'x'
.Cela fonctionne par l'initialisation d'une variable
i
et définir égal àn
. Vous pouvez ensuite mettre en place unwhile
boucle qui s'exécute pendant quei
est inférieure à la longueur deletters
. Vous pouvez ensuite insérer'x'
à l'indexi
dansletters
. Ensuite, vous devez ajouter la valeur den+1
ài
. La raison pour laquelle vous devez le fairen+1
au lieu de simplementn
est parce que lorsque vous insérez un élément deletters
, il augmente la longueur de la liste par un.Avec votre exemple où
n
est 3 et que vous souhaitez insérer'x'
, il devrait ressembler à ceciqui permettrait d'imprimer
qui est le résultat escompté.
O(n)
, utilisé à l'intérieur d'unwhile
boucle quadratique. Voici le wiki affichant le temps de la complexité de chaque opération.insert
est O(n). Merci 🙂Bien que l'utilisation de
list.insert()
dans unfor
boucle semble être plus efficace en terme de mémoire, dans l'ordre de le faire en une seule ligne, vous pouvez aussi ajouter de la valeur donnée à la fin de chaque divisé de manière égale des morceaux de split sur chaquenth
index de la liste.itertools.chain
de la méthode, rend un objet iterable[item for subgroup in group for item in subgroup]
qui est toujours aussi difficile à retenir. Aussi +1 pour l'utilisation de ternaire dans une liste de compréhension; pour une raison que je n'avais pas pensé à ça, génial!Une jolie méthode simple:
Vous pouvez également utiliser le
grouper
recette de la itertools de la documentation pour le chunking.new_list.pop()
pop une valeur qui est en fait censé être là?'x'
j'ai ajouté en dernier.Je veux ajouter un nouvel élément par élément.
Comment à ce sujet ?
un est maintenant
C'est un vieux sujet, mais il manque le plus facile, le plus "pythonic" de la solution, de l'omi. Il n'est plus qu'une extension à la partie 2 de Marque Mikofski's accepté de répondre à que l'on améliore la lisibilité (et donc le rend plus pythonic).
Tout Marque Mikofski's réponse fonctionne, il y a une solution plus rapide par l'attribution de tranches:
produit (à l'aide de jupyter ordinateur portable)