Comme vous utilisez Python 3, c'est facile. PEP 3132 a introduit une simplification bienvenue de la syntaxe lors de l'assignation à des tuples - Déballage étendu d'itérable. Dans le passé, lors de l'assignation à des variables dans un tuple, le nombre d'éléments à gauche de l'assignation doit être exactement égal à celui de la droite.
En Python 3, nous pouvons désigner n'importe quelle variable à gauche comme une liste en la préfixant d'un astérisque *. Cela récupère autant de valeurs qu'il le peut, tout en peuplant les variables à sa droite (donc ce n'a pas besoin d'être l'élément le plus à droite). Cela évite de nombreuses découpes complexes lorsque nous ne connaissons pas la longueur d'un tuple.
a, *b = "foo".split(":")
print("a:", a, "b:", b)
Donne :
a: foo b: []
ÉDITER suite aux commentaires et discussions :
En comparaison avec la version Perl, c'est considérablement différent, mais c'est la manière Python (3). Comparé à la version Perl, re.split()
serait plus similaire, cependant invoquer le moteur RE pour diviser autour d'un seul caractère est une surcharge inutile.
Avec plusieurs éléments en Python :
s = 'hello:world:sailor'
a, *b = s.split(":")
print("a:", a, "b:", b)
donne :
a: hello b: ['world', 'sailor']
Cependant en Perl :
my $s = 'hello:world:sailor';
my ($a, $b) = split /:/, $s;
print "a: $a b: $b\n";
donne :
a: hello b: world
Il est possible de constater que des éléments supplémentaires sont ignorés ou perdus en Perl. C'est assez facile à reproduire en Python si nécessaire :
s = 'hello:world:sailor'
a, *b = s.split(":")
b = b[0]
print("a:", a, "b:", b)
Ainsi, a, *b = s.split(":")
l'équivalent en Perl serait
my ($a, @b) = split /:/, $s;
NB : on ne devrait pas utiliser $a
et $b
en général en Perl car ils ont un sens spécial lorsqu'ils sont utilisés avec sort
. Je les ai utilisés ici par cohérence avec l'exemple Python.
Python a aussi un tour supplémentaire dans sa manche, nous pouvons déballer vers n'importe quel élément dans le tuple à gauche :
s = "one:two:three:four"
a, *b, c = s.split(':')
print("a:", a, "b:", b, "c:", c)
Donne :
a: one b: ['two', 'three'] c: four
Tandis que dans l'équivalent Perl, le tableau (@b
) est gourmand, et le scalaire $c
est undef
:
use strict;
use warnings;
my $s = 'one:two:three:four';
my ($a, @b, $c) = split /:/, $s;
print "a: $a b: @b c: $c\n";
Donne :
Use of uninitialized value $c in concatenation (.) or string at gash.pl line 8.
a: one b: two three four c:
4 votes
En Perl, que se passe-t-il si la chaîne ne contient pas le motif ? Est-ce que
$x
et$y
reçoivent la chaîne entière, ou est-ce que$y
reçoit null ou quelque chose d'autre ?6 votes
@Don'tPanic:
$x
obtient toute la chaîne,$y
estundef
(qui est similaire àNone
, mais légèrement différent).0 votes
Quel est le comportement attendu quand ils contiennent plusieurs occurrences du motif de séparation ? De plus, l'argument de motif dans
split
de Perl est-il une regex ou une chaîne régulière ?4 votes
@jpmc26 : en Perl, il ignorerait les valeurs supplémentaires. Mais je doute que nous voulions vraiment écrire un émulateur Perl en python.
7 votes
@cdarke Bien sûr, nous n'écrivons pas un émulateur Perl, mais nous ne pouvons pas répondre à la question sans savoir quel est le comportement souhaité. Un aspect important du code de l'OP qu'ils omettent de la question est que la version Python échouerait également si la chaîne contenait des multiples deux-points. Quoi qu'il en soit, la documentation semble vous contredire. Il semble que Perl renvoie une liste, en scindant à chaque occurrence du motif, de la même manière que la fonction
split
de Python. Il semble également que la fonctionsplit
de Perl accepte un regex.2 votes
@jpmc26 Une liste Perl n'est pas la même qu'une liste Python, elle est plus proche d'un tuple, sauf que vous ne pouvez pas avoir de variable de type liste en Perl, et vous ne pouvez pas non plus en avoir de référence. Une liste en Perl n'est vraiment qu'un dispositif syntaxique. Il y a une discussion ici : friedo.com/blog/2013/07/arrays-vs-lists-in-perl. Oui,
split
de Perl ressemble plus àre.split
sauf qu'il y a de la magie supplémentaire pour les espaces vides.1 votes
@cdarke Votre commentaire ne fait qu'accentuer mon point : nous avons besoin de clarté sur ce que l'auteur de la question demande en raison des différences entre les deux langues. Il ne suffit pas de dire "Je veux ce que fait cette autre langue." Le "quoi" doit être clarifié en comportements concrets qui sont requis.
0 votes
La façon "correcte", dans l'idiome Python, est d'essayer et de capturer l'exception. Les exceptions sont très rapides en Python.
0 votes
Que voulez-vous dire par « travail » ? Qu'attendez-vous qu'il fasse ? Vous devez spécifier car nous ne sommes pas des mentalistes.