139 votes

Pourquoi les chaînes vides sont-elles renvoyées dans les résultats de split ()?

Quel est le point de '/segment/segment/'.split('/') retour ['', 'segment', 'segment', ''] ?

Remarquez les éléments vides. Si vous séparez un délimiteur qui se trouve à la position un et à la toute fin d'une chaîne, quelle valeur supplémentaire vous donne-t-il pour que la chaîne vide soit renvoyée à chaque extrémité?

202voto

gnibbler Points 103484

str.split complète str.join , donc

 "/".join(['', 'segment', 'segment', ''])
 

vous récupère la chaîne d'origine.

Si les chaînes vides n'étaient pas là, le premier et le dernier '/' seraient manquants après le join()

29voto

Alok Singhal Points 33073

Il y a deux points principaux à considérer ici:

  • Attend le résultat de l' '/segment/segment/'.split('/') être égale à ['segment', 'segment'] est raisonnable, mais ça perd de l'information. Si split() a travaillé comme tu voulais, si je vous dis qu' a.split('/') == ['segment', 'segment'], vous ne pouvez pas me dire ce qu' a a été.
  • Quel devrait être le résultat d' 'a//b'.split() ? ['a', 'b']?, ou ['a', '', 'b']? I. e., devrait - split() fusion séparateurs adjacentes? Si il le devrait, alors il sera très difficile à analyser les données délimitées par un caractère, et certains champs peuvent être vides. Je suis assez sûr qu'il ya beaucoup de gens qui ne veulent les valeurs vides dans le résultat pour le cas ci-dessus!

En fin de compte, il se résume à deux choses:

La cohérence: si j'ai n délimiteurs, en a, j'obtiens n+1 des valeurs de retour après l' split().

Il devrait être possible de faire des choses complexes, et il est facile de faire des choses simples: si vous souhaitez ignorer les chaînes vides comme un résultat de l' split(), vous pouvez toujours le faire:

def mysplit(s, delim=None):
    return [x for x in s.split(delim) if x]

mais si l'on ne veut pas ignorer les valeurs vides, on devrait être en mesure de.

La langue a du choisir une définition de l' split()—il y a trop de cas d'utilisation pour satisfaire tout le monde l'exigence en tant que par défaut. Je pense que Python choix est bon, et est le plus logique. (En aparté, l'une des raisons pour lesquelles je n'aime pas C strtok() est parce qu'il fusionne séparateurs adjacentes, ce qui rend extrêmement difficile de faire de sérieuses analyse/la segmentation avec elle.)

Il y a une exception: a.split() sans argument serre consécutives, espace blanc, mais on peut dire que c'est la bonne chose à faire dans ce cas. Si vous ne voulez pas le problème, vous pouvez toujours a.split(' ').

9voto

Alex Martelli Points 330805

Ayant x.split(y) toujours retourner une liste d' 1 + x.count(y) des objets est un précieux régularité -- @gnibbler déjà souligné, il fait split et join exactes inverses les uns des autres (comme il est évident qu'ils devraient l'être), il a aussi précisément cartes de la sémantique de tous les types de séparateur de joint (tels que csv lignes du fichier [[net de citer les questions]], les lignes de /etc/group sous Unix, et ainsi de suite), il permet, comme @Romain de réponse mentionné) contrôles faciles pour (par exemple) absolue vs les chemins relatifs (dans les chemins de fichiers et d'Url), et ainsi de suite.

Une autre façon de voir les choses, c'est que vous ne devriez pas délibérément mélanger des informations de la fenêtre pour aucun gain. Ce serait acquise en établissant x.split(y) équivalent à x.strip(y).split(y)? Rien, bien sûr-il est facile à utiliser la deuxième forme quand c'est ce que tu veux dire, mais si la première forme a été arbitrairement réputée signifier le second, vous auriez beaucoup de travail à faire quand vous ne voulez que le premier (qui est loin d'être rares, comme le paragraphe précédent points).

Mais vraiment, penser en termes de régularité mathématique est le plus simple et le plus général de la façon dont vous pouvez apprendre par vous-même à la conception passable Api. Pour prendre un autre exemple, il est très important que, pour être valable, toute x et y x == x[:y] + x[y:] -- qui indique immédiatement pourquoi un extrême d'un découpage doit être exclue. Le plus simple, l'invariant de l'assertion, vous pouvez formuler, les chances, c'est que la résultante de la sémantique sont ce que vous avez besoin dans la vie réelle utilise-une partie de la mystique fait que les maths, c'est très utile dans le traitement de l'univers.

Essayez la formulation de l'invariant pour un split le dialecte dans lequel attaque et de fuite des délimiteurs sont des tubé... contre-exemple: la chaîne de méthodes telles que l' isspace ne sont pas au maximum de simple - x.isspace() est équivalent à x and all(c in string.whitespace for c in x) -- ce stupide menant x and est pourquoi vous le trouvez souvent de codage not x or x.isspace(), pour revenir à la simplicité qui doit avoir été conçu dans l' is... chaîne de méthodes (une chaîne vide "est" tout ce que vous voulez, contrairement à l'homme-dans-la-rue du cheval-sens, peut-être [[vide ensembles, comme zéro &c, ont toujours confondu la plupart des gens;-)]], mais totalement conforme à l'évidence bien raffiné mathématique de bon sens!-).

8voto

jamieb Points 2892

Je ne suis pas sûr du type de réponse que vous recherchez? Vous obtenez trois correspondances parce que vous avez trois délimiteurs. Si vous ne voulez pas que celui-ci soit vide, utilisez simplement:

 '/segment/segment/'.strip('/').split('/')
 

6voto

Roman Points 781

Eh bien, il vous permet de savoir qu'il y avait un délimiteur. Ainsi, voir 4 résultats vous permet de savoir que vous l'avait 3 séparateurs. Cela vous donne le pouvoir de faire ce que vous voulez avec cette information, plutôt que d'avoir Python-déposer les éléments vides, et puis vous faire procéder à la vérification manuelle de fin ou de début des délimiteurs si vous avez besoin de le savoir.

Simple exemple: Disons que vous voulez vérifier l'absolu vs relative des noms de fichiers. De cette façon, vous pouvez tout faire avec le split, sans avoir à vérifier ce que le premier caractère de votre nom de fichier est.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X