Salut,
J’imagine que tu parles de Python ?
Déjà je dirais que la première approche est de découper ta chaîne en jetons, tu peux faire ça assez facilement avec une expression rationnelle (regex) : chaque jeton est composée d’une lettre et d’un nombre (une suite de chiffres), soit [A-Z][0-9]+
.
Ainsi,
>>> import re
>>> re.findall(r'[A-Z][0-9]+', myString)
['A10', 'A14', 'A28', 'B33', 'B44', 'C17', 'C21', 'D6', 'D18', 'D25', 'E13', 'E15', 'E20', 'E35', 'F0', 'F1', 'F0', 'F19', 'F5']
La suite consiste à récupérer les nombres associés à chaque lettre, avec les conversions que ça implique, et à les stocker dans la liste correspondante.
Le plus simple pour ça est d’utiliser un dictionnaire lettre ⇒ liste de nombres.
De plus les dictionnaires ont une méthode setdefault
bien pratique pour ça : ça permet de s’assurer qu’une clé sera présente dans le dictionnaire (donc d’avoir une liste déjà présente, prête à être remplie) :
>>> tokens = re.findall(r'[A-Z][0-9]+', myString)
>>> groups = {}
>>> for token in tokens:
... letter = token[0]
... number = int(token[1:])
... groups.setdefault(letter, []).append(number)
...
>>> groups
{'A': [10, 14, 28], 'B': [33, 44], 'C': [17, 21], 'D': [6, 18, 25], 'E': [13, 15, 20, 35], 'F': [0, 1, 0, 19, 5]}
Si tu es familier avec groupby
du module itertools
et si tes éléments dans myString
sont toujours bien ordonnés, ça peut aussi se faire en une ligne :
>>> from itertools import groupby
>>> {letter: [int(t[1:]) for t in group] for letter, group in groupby(tokens, key=lambda t: t[0])}
{'A': [10, 14, 28], 'B': [33, 44], 'C': [17, 21], 'D': [6, 18, 25], 'E': [13, 15, 20, 35], 'F': [0, 1, 0, 19, 5]}