web-dev-qa-db-fra.com

Le moyen le plus rapide de scinder une chaîne concaténée en un tuple et d'ignorer les chaînes vides

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?

11
MLister

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 
8
David Wolever

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.

12
Levon

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(';'))
4
exfizik

Essayez Tuple(my_str.split(';')[:-1])

3
googler

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 ...

2
voithos

utilisez split puis slicing:

 my_str.split(';')[:-1]

ou :

lis=[x for x in my_str.split(';') if x]
1
Ashwini Chaudhary