conversion str en liste de str de 2 chars

Le
Nicolas
Bonjour,

Soit la chaine suivante :
t = "abcdefghijklmnop"

Je veux la transformer en liste de chaines de 2 caractères :
['ab', 'cd', 'ef', 'gh', 'ij', 'kl', 'mn', 'op']

Quelle est la meilleure méthode ?

J'ai ça :
[t[i]+t[i+1] for i in range(0, len(t), 2)]

J'ai aussi ça :
[''.join(l) for l in zip(t[::2], t[1::2])]

Pour ma culture, est-ce qu'il y a "mieux" ?

Nicolas
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Alain Ketterlin
Le #26387348
Nicolas
Soit la chaine suivante :
t = "abcdefghijklmnop"

Je veux la transformer en liste de chaines de 2 caractères :
['ab', 'cd', 'ef', 'gh', 'ij', 'kl', 'mn', 'op']

Quelle est la meilleure méthode ?

J'ai ça :
[t[i]+t[i+1] for i in range(0, len(t), 2)]



Ca va planter pour toute chaine de longueur impaire. Il vaut mieux :

[t[i:i+2] for i in range(0, len(t), 2)]

(en général, hein, après ça dépend de ton usage).

J'ai aussi ça :
[''.join(l) for l in zip(t[::2], t[1::2])]



Pour les longueurs impaires, un caractère disparait, non ?

Pour ma culture, est-ce qu'il y a "mieux" ?



La deuxième, à base join/zip, me semble quand même un peu ca pilotractée
(join sur des paires, est-ce bien nécessaire ?). Perso, j'utiliserais la
première, peut-etre cachée dans un générateur.

-- Alain.
Benoit Izac
Le #26387416
Bonjour,

Le 01/02/2016 à 10:45, Nicolas a écrit dans le message

Soit la chaine suivante :
t = "abcdefghijklmnop"

Je veux la transformer en liste de chaines de 2 caractères :
['ab', 'cd', 'ef', 'gh', 'ij', 'kl', 'mn', 'op']

Quelle est la meilleure méthode ?

J'ai ça :
[t[i]+t[i+1] for i in range(0, len(t), 2)]

J'ai aussi ça :
[''.join(l) for l in zip(t[::2], t[1::2])]

Pour ma culture, est-ce qu'il y a "mieux" ?



Mieux, je ne sais pas mais tu peux aussi utiliser le module re :

import re
l = re.findall('..', t)

ou

l = re.findall('..?', t)

si ta chaîne contient un nombre impair d'éléments et que tu souhaites
garder le dernier.

--
Benoit Izac
Nicolas
Le #26387510
Le 01/02/2016 11:54, Alain Ketterlin a écrit :
Nicolas
Soit la chaine suivante :
t = "abcdefghijklmnop"

Je veux la transformer en liste de chaines de 2 caractères :
['ab', 'cd', 'ef', 'gh', 'ij', 'kl', 'mn', 'op']

Quelle est la meilleure méthode ?

J'ai ça :
[t[i]+t[i+1] for i in range(0, len(t), 2)]



Ca va planter pour toute chaine de longueur impaire. Il vaut mieux :

[t[i:i+2] for i in range(0, len(t), 2)]

(en général, hein, après ça dépend de ton usage).


Dans le cas présent, la chaine est toujours de longueur paire.
Mais la remarque est judicieuse. Si les données d'entrées sont non
conformes, ça évite effectivement un arrêt du soft.

J'ai aussi ça :
[''.join(l) for l in zip(t[::2], t[1::2])]



Pour les longueurs impaires, un caractère disparait, non ?

Pour ma culture, est-ce qu'il y a "mieux" ?



La deuxième, à base join/zip, me semble quand même un peu capilotractée
(join sur des paires, est-ce bien nécessaire ?). Perso, j'utiliserais la
première, peut-etre cachée dans un générateur.


C'est que je me disais aussi ; un peu lourd comme méthode.
On perd effectivement un caractère lorsque la chaine est de longueur
impaire mais c'est sans importance dans mon cas (chaine toujours de
longueur paire).

-- Alain.



Merci
Nicolas
Nicolas
Le #26387509
Le 01/02/2016 16:05, Benoit Izac a écrit :
Bonjour,

Le 01/02/2016 à 10:45, Nicolas a écrit dans le message

Soit la chaine suivante :
t = "abcdefghijklmnop"

Je veux la transformer en liste de chaines de 2 caractères :
['ab', 'cd', 'ef', 'gh', 'ij', 'kl', 'mn', 'op']

Quelle est la meilleure méthode ?

J'ai ça :
[t[i]+t[i+1] for i in range(0, len(t), 2)]

J'ai aussi ça :
[''.join(l) for l in zip(t[::2], t[1::2])]

Pour ma culture, est-ce qu'il y a "mieux" ?



Mieux, je ne sais pas mais tu peux aussi utiliser le module re :

import re
l = re.findall('..', t)

ou

l = re.findall('..?', t)

si ta chaîne contient un nombre impair d'éléments et que tu souhaites
garder le dernier.



Utilisation intéressante des expressions régulières.

Merci
Nicolas
Publicité
Poster une réponse
Anonyme