Est-il possible de diviser une chaîne tous les n caractères?
Par exemple, supposons que j'ai une chaîne contenant les éléments suivants:
'1234567890'
Comment puis-je le faire ressembler à ceci:
['12','34','56','78','90']
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range(0, len(line), n)]
['12', '34', '56', '78', '90']
Juste pour être complet, vous pouvez le faire avec une expression régulière:
Pour un nombre impair de caractères, vous pouvez le faire:
Vous pouvez également effectuer les opérations suivantes, pour simplifier l'expression régulière pour des segments plus longs:
Et vous pouvez utiliser
re.finditer
si la chaîne est longue pour générer morceau par morceau.la source
'.'*n
pour le rendre plus clair. Pas de jointure, pas de fermeture éclair, pas de boucles, pas de compréhension de liste; il suffit de trouver les deux personnages suivants l'un à côté de l'autre, ce qui est exactement la façon dont le cerveau humain y pense. Si Monty Python était encore en vie, il adorerait cette méthode!flags=re.S
.Il existe déjà une fonction intégrée en python pour cela.
Voici ce que dit la docstring pour wrap:
la source
wrap
peut ne pas retourner ce qui est demandé si la chaîne contient de l'espace. par exemplewrap('0 1 2 3 4 5', 2)
retours['0', '1', '2', '3', '4', '5']
(les éléments sont dépouillés)Une autre façon courante de regrouper des éléments en groupes de n longueurs:
Cette méthode provient directement de la documentation de
zip()
.la source
zip(*[iter(s)]*2)
difficile à comprendre, lisez Commentzip(*[iter(s)]*n)
fonctionne en Python? .>>> map(''.join, zip(*[iter('01234567')]*5))
->['01234']
zip()
paritertools.zip_longest()
:map(''.join, zip_longest(*[iter(s)]*2, fillvalue=''))
maps()
Je pense que c'est plus court et plus lisible que la version itertools:
la source
J'aime cette solution:
la source
Utilisation d' outils plus itératifs de PyPI:
la source
Vous pouvez utiliser la
grouper()
recette deitertools
:Python 2.x:
Python 3.x:
Ces fonctions sont efficaces en mémoire et fonctionnent avec tous les itérables.
la source
Essayez le code suivant:
la source
yield ''.join(piece)
pour le faire fonctionner comme prévu: eval.in/813878la source
Essaye ça:
Production:
la source
Comme toujours, pour ceux qui aiment un liners
la source
print(line)
je reçoisthis is a line split into n characters
comme sortie. Pourriez-vous mieux mettreline = [line[i * n:i * n+n] for i,blah in enumerate(line[::n])]
:? Corrigez cela et c'est une bonne réponse :).,blah
et pourquoi c'est nécessaire? Je remarque que je peux remplacerblah
par n'importe quel caractère alpha, mais pas de chiffres, et je ne peux pas supprimer leblah
/ ou la virgule. Mon éditeur suggère d'ajouter un espace après,
: senumerate
renvoie deux itérables, vous avez donc besoin de deux emplacements pour les mettre. Mais vous n'avez en fait pas besoin du deuxième itérable pour quoi que ce soit dans ce cas.blah
je préfère utiliser un trait de soulignement ou un double trait de soulignement, voir: stackoverflow.com/questions/5893163/…Une solution récursive simple pour chaîne courte:
Ou sous une telle forme:
, qui illustre le modèle typique de division et de conquête dans une approche récursive de manière plus explicite (bien qu'il ne soit pas nécessaire de le faire de cette façon)
la source
J'étais coincé dans le même scénario.
Cela a fonctionné pour moi
Production
la source
more_itertools.sliced
a déjà été mentionné . Voici quatre autres options de lamore_itertools
bibliothèque:Chacune de ces dernières options produit la sortie suivante:
Documentation pour les options discutées:
grouper
,chunked
,windowed
,split_after
la source
Ceci peut être réalisé par une simple boucle for.
La sortie ressemble à ['12', '34', '56', '78', '90', 'a']
la source