J'ai une chaîne concaténée comme ceci:
my_str = 'str1;str2;str3;'
et je voudrais lui appliquer la fonction split
puis convertir la liste résultante en un tuple, et me débarrasser de toute chaîne vide résultant de la split
(notez le dernier ';' à la fin)
Jusqu'à présent, je fais ceci:
Tuple(filter(None, my_str.split(';')))
Existe-t-il un moyen plus efficace (en termes de vitesse et d'espace) de le faire?
C'est une façon très raisonnable de le faire. Quelques alternatives:
foo.strip(";").split(";")
(si la chaîne ne contient aucune tranche vide)[ x.strip() for x in foo.split(";") if x.strip() ]
(pour supprimer les espaces de chaque tranche)Le moyen le plus rapide de faire cela dépendra de beaucoup de choses… mais vous pouvez facilement expérimenter avec le %timeit
de ipython:
Dans [1]: foo = "1; 2; 3; 4;" Dans [2]:% timeit foo.strip (";"). Split ( ";") 1000000 boucles, meilleur de 3: 1,03 us par boucle Dans [3]:% timeit filter (None, foo.split (';')) 1000000 boucles, meilleur de 3: 1,55 us par boucle
Que dis-tu de ça?
Tuple(my_str.split(';')[:-1])
('str1', 'str2', 'str3')
Vous scindez la chaîne au caractère ;
et transmettez toutes les sous-chaînes (sauf la dernière, la chaîne vide) à Tuple pour créer le résultat Tuple.
Si vous attendez seulement une chaîne vide à la fin, vous pouvez faire:
a = 'str1;str2;str3;'
Tuple(a.split(';')[:-1])
ou
Tuple(a[:-1].split(';'))
Essayez Tuple(my_str.split(';')[:-1])
Oui, c'est une façon plutôt pythonique de le faire. Si vous aimez les expressions de générateur, vous pouvez également remplacer la fonction filter()
par:
Tuple(part for part in my_str.split(';') if part)
Cela présente l'avantage de permettre un traitement ultérieur sur chaque pièce en ligne.
Il est intéressant de noter que la documentation de str.split()
indique:
... Si sep n'est pas spécifié ou est None, toute chaîne d'espacement est un séparateur et les chaînes vides sont supprimées du résultat .
Je me demande pourquoi ce cas particulier a été fait, sans le permettre pour d'autres séparateurs ...
utilisez split puis slicing:
my_str.split(';')[:-1]
ou :
lis=[x for x in my_str.split(';') if x]