Lorsque je fractionne une chaîne "abac", j'obtiens des résultats indésirables.

Exemple

print("abac".split("a"))

Pourquoi imprime-t-il:

['', 'avant JC']

Au lieu de

['avant JC']

Quelqu'un peut-il expliquer ce comportement et me guider sur la façon d'obtenir la sortie souhaitée?

Merci d'avance.

-1
arti8719 20 nov. 2018 à 23:59

4 réponses

Meilleure réponse

Comme @DeepSpace l'a souligné (se référant à docs)

Si sep est indiqué, les délimiteurs consécutifs ne sont pas regroupés et sont réputés délimiter des chaînes vides (par exemple, '1,, 2'.split (', ') renvoie [' 1 ',' ',' 2 ']).

Par conséquent, je suggère d'utiliser un meilleur délimiteur tel qu'une virgule , ou si c'est le formatage avec lequel vous êtes coincé, vous pouvez simplement utiliser le filter() fonctionne comme suggéré dans this answer, this will remove any" empty "strings if passed None as the function.

sample = 'abac'
filtered_sample = filter(None, sample.split('a'))
print(filtered_sample)
#['b', 'c']
1
Jab 20 nov. 2018 à 21:13

Lorsque vous divisez une chaîne en python, vous conservez tout entre vos délimiteurs (même s'il s'agit d'une chaîne vide!)

Par exemple, si vous aviez une liste de lettres séparées par des virgules:

>>> "a,b,c,d".split(',')
['a','b','c','d']

Si votre liste contient des valeurs manquantes, vous pouvez laisser l'espace entre les virgules vide:

>>> "a,b,,d".split(',')
['a','b','','d']

Le début et la fin de la chaîne agissent comme des délimiteurs eux-mêmes, donc si vous avez un délimiteur de début ou de fin, vous obtiendrez également cette "chaîne vide" coupée de votre chaîne principale:

>>> "a,b,c,d,,".split(',')
['a','b','c','d','','']

>>> ",a,b,c,d".split(',')
['','a','b','c','d']

Si vous souhaitez vous débarrasser de toutes les chaînes vides dans votre sortie, vous pouvez utilisez la fonction de filtre.

Si au lieu de cela, vous souhaitez simplement vous débarrasser de ce comportement près des bords de votre chaîne principale, vous pouvez d'abord supprimer les délimiteurs:

>>> ",,a,b,c,d".strip(',')
"a,b,c,d"

>>> ",,a,b,c,d".strip(',').split(',')
['a','b','c','d']
0
jfbeltran 20 nov. 2018 à 21:04

split renverra les caractères entre les délimiteurs que vous spécifiez (ou entre une fin de chaîne et un délimiteur), même s'il n'y en a pas, auquel cas il renverra une chaîne vide. (Voir la documentation pour plus d'informations.)

Dans ce cas, si vous ne voulez pas de chaînes vides dans la sortie, vous pouvez utiliser filter pour les supprimer:

list(filter(lambda s: len(s) > 0, "abac".split("a"))
0
Harry Cutts 20 nov. 2018 à 21:07

Dans votre exemple, "a" est ce qu'on appelle un délimiteur. Il agit comme une frontière entre les caractères avant et après. Ainsi, lorsque vous appelez split, il obtient les caractères avant "a" et après "a" et les insère dans la liste. Puisqu'il n'y a rien devant le premier "a" de la chaîne "abac", il retourne une chaîne vide et l'insère dans la liste.

0
Yang K 20 nov. 2018 à 21:05