Question : J'utilise split('\n')
pour obtenir des lignes dans une seule chaîne, et j'ai trouvé que ''.split()
renvoie une liste vide, []
alors que ''.split('\n')
renvoie à ['']
.
Le site str.split()
a deux algorithmes. Si aucun argument n'est donné, elle divise sur des passages répétés d'espaces blancs. En revanche, si un argument est donné, il est traité comme un seul délimiteur, sans répétition.
Dans le cas de la division d'une chaîne vide, le premier mode (sans argument) renverra une liste vide parce que les espaces blancs sont mangés et qu'il n'y a pas de valeurs à mettre dans la liste de résultats.
En revanche, le second mode (avec un argument tel que \n
) produira le premier champ vide. Considérez que si vous aviez écrit '\n'.split('\n')
vous obtiendrez deux champs (un divisé, ce qui vous donne deux moitiés).
Question : Y a-t-il une raison spécifique pour une telle différence ?
Ce premier mode est utile lorsque les données sont alignées dans des colonnes comportant des quantités variables d'espaces blancs. Par exemple :
>>> data = '''\
Shasta California 14,200
McKinley Alaska 20,300
Fuji Japan 12,400
'''
>>> for line in data.splitlines():
print(line.split())
['Shasta', 'California', '14,200']
['McKinley', 'Alaska', '20,300']
['Fuji', 'Japan', '12,400']
Le deuxième mode est utile pour les données délimitées telles que CSV où les virgules répétées indiquent les champs vides. Par exemple :
>>> data = '''\
Guido,BDFL,,Amsterdam
Barry,FLUFL,,USA
Tim,,,USA
'''
>>> for line in data.splitlines():
print(line.split(','))
['Guido', 'BDFL', '', 'Amsterdam']
['Barry', 'FLUFL', '', 'USA']
['Tim', '', '', 'USA']
Remarque : le nombre de champs de résultat est supérieur d'une unité au nombre de délimiteurs. Imaginez que vous coupez une corde. Si vous ne faites aucune coupe, vous avez un morceau. Si vous faites une coupe, vous obtenez deux morceaux. En faisant deux coupes, on obtient trois morceaux. Il en va de même avec la méthode Python str.split(delimiter)
méthode :
>>> ''.split(',') # No cuts
['']
>>> ','.split(',') # One cut
['', '']
>>> ',,'.split(',') # Two cuts
['', '', '']
Question : Existe-t-il un moyen plus pratique de compter les lignes d'une chaîne de caractères ?
Oui, il y a quelques moyens faciles. La première utilise str.count()
et les autres utilisations str.splitlines()
. Les deux méthodes donnent la même réponse, à moins que la dernière ligne ne soit manquante. \n
. Si le dernier saut de ligne est manquant, le str.splitlines
donnera la réponse exacte. Une technique plus rapide, qui est également précise, utilise la méthode de comptage mais la corrige ensuite pour le saut de ligne final :
>>> data = '''\
Line 1
Line 2
Line 3
Line 4'''
>>> data.count('\n') # Inaccurate
3
>>> len(data.splitlines()) # Accurate, but slow
4
>>> data.count('\n') + (not data.endswith('\n')) # Accurate and fast
4
Question de @Kaz : Pourquoi diable deux algorithmes très différents sont-ils intégrés dans une seule fonction ?
La signature pour str.split
a environ 20 ans, et un certain nombre d'API de cette époque sont strictement pragmatiques. Bien qu'elle ne soit pas parfaite, la signature de la méthode n'est pas "terrible" non plus. Pour l'essentiel, les choix de Guido en matière de conception d'API ont résisté à l'épreuve du temps.
L'API actuelle n'est pas sans avantages. Considérez des chaînes de caractères telles que :
ps_aux_header = 'USER PID %CPU %MEM VSZ'
patient_header = 'name,age,height,weight'
Lorsqu'on leur demande de décomposer ces chaînes en champs, les gens ont tendance à les décrire en utilisant le même mot anglais, "split". Lorsqu'on leur demande de lire un code tel que fields = line.split()
ou fields = line.split(',')
les gens ont tendance à interpréter correctement les déclarations comme "divise une ligne en champs".
Les fonctions de Microsoft Excel outil de transformation du texte en colonnes a fait un choix similaire d'API et intègre les deux algorithmes de fractionnement dans le même outil. Les gens semblent mentalement modeler le fractionnement de champ comme un concept unique, même si plus d'un algorithme est impliqué.
2 votes
Duplicata possible de Pourquoi les chaînes vides sont-elles retournées dans les résultats de split() ?