conversion str en liste de str de 2 chars

4 réponses
Avatar
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

4 réponses

Avatar
Alain Ketterlin
Nicolas writes:

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.
Avatar
Benoit Izac
Bonjour,

Le 01/02/2016 à 10:45, Nicolas a écrit dans le message
<56af291c$0$3328$ :

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
Avatar
Nicolas
Le 01/02/2016 11:54, Alain Ketterlin a écrit :
Nicolas writes:

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
Avatar
Nicolas
Le 01/02/2016 16:05, Benoit Izac a écrit :
Bonjour,

Le 01/02/2016 à 10:45, Nicolas a écrit dans le message
<56af291c$0$3328$ :

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