Analyser un tuple d'une chaîne de caractères?
Dire que j'ai une chaîne de caractères qui est de la même forme d'un tuple doit être, par exemple, "(1,2,3,4,5)"
. Quelle est la façon la plus facile de convertir en un véritable tuple? Un exemple de ce que je veux faire c'est:
tup_string = "(1,2,3,4,5)"
tup = make_tuple(tup_string)
Juste en cours d'exécution tuple()
sur la chaîne de rendre la chose un grand tuple, alors que ce que je voudrais faire est de comprendre la chaîne comme un n-uplet. Je sais que je peux utiliser une regex pour ça, mais j'espérais qu'il y est une manière moins coûteuse. Des idées?
- D'où vient la chaîne vient?
Vous devez vous connecter pour publier un commentaire.
Il il existe déjà!
Être conscient du coin cas, si:
Si votre format d'entrée des œuvres différentes de Python ici, vous avez besoin pour gérer ce cas, séparément ou utiliser une autre méthode comme
tuple(int(x) for x in tup_string[1:-1].split(','))
.groupby
oubisect
🙂not isinstance(make_tuple("('any-string')"), basestring)
et pad make_tuple de sortie avec la virgule supplémentaire si nécessaire.Vous pouvez analyser votre chaîne sans
SyntaxError
Cette fonction retourne la
Tuple
si parser est un succès. Sinon retourNone
.Je vous conseille d'utiliser
literal_eval
.Si vous n'êtes pas à l'aise avec
literal_eval
ou si vous voulez avoir plus de contrôle sur ce qui se converti vous pouvez également démonter la chaîne, convertir les valeurs et recréer le tuple.Semble plus compliqué qu'il ne l'est vraiment, c'est un one-liner:
Ce serait jeter un
ValueError
si un élément quelconque de caractères (string) dans le tuple n'est pas convertible àint
, comme, par exemple, le'1.2'
dans la chaîne:'(1.2, 3, 4)'
.Le même effet peut être obtenu avec regex:
eg_tuple = eg.strip('()').split(',')
On peut aussi l'analyser par nous-mêmes.
Disons que nous avons tuple retourné par Python comme ci-dessous:
Voilà comment nous le faisons
D'abord, nous continuons à lire les caractères dans le tuple string mais stocke le dernier point-virgule à gauche de la position et de combien de points-virgules, nous avons rencontrer (on peut l'appeler à gauche point-virgule niveau, comme pour le droit des points-virgules), chaque fois que nous rencontrons un droit point-virgule, nous faisons les choses ci-dessous:
cette sous-chaîne, il n'y a plus de points-virgules, nous venons de le diviser en
tableau par ",". Disons que la nouvelle matrice est
M
)M
à notre tableau résultat, tableau qui stocke toutes lesM
.Enfin, faire les mêmes choses comme l'étape 1 jusqu'à la droite et à gauche
point-virgule niveau vient à 0.
Code JavaScript est comme ci-dessous:
JS: