Dato che siete su Python 3, è facile. PEP 3132 ha introdotto una gradita semplificazione della sintassi durante l'assegnazione alle tuple - Esteso disimballaggio iterabile. In passato, se si assegna a variabili in una tupla, il numero di elementi a sinistra del compito deve essere esattamente uguale a quello a destra.
In Python 3 possiamo designare qualsiasi variabile a sinistra come una lista precedendo con un asterisco *. Questo catturerà quanti più valori possibile, mentre continua a compilare le variabili alla sua destra (quindi non deve essere l'elemento più a destra). Questo evita molte fette sgradevoli quando non conosciamo la lunghezza di una tupla.
a, *b = "foo".split(":")
print("a:", a, "b:", b)
Dà:
a: foo b: []
EDIT commenti e discussione:
Rispetto alla versione di Perl, questo è molto diverso, ma è il Python (3) modo. In confronto con la versione Perl, re.split()
sarebbe più simile, tuttavia il richiamo del motore RE per la divisione attorno a un singolo carattere è un sovraccarico non necessario.
Con gli elementi più in Python:
s = 'hello:world:sailor'
a, *b = s.split(":")
print("a:", a, "b:", b)
dà:
a: hello b: ['world', 'sailor']
Tuttavia in Perl:
my $s = 'hello:world:sailor';
my ($a, $b) = split /:/, $s;
print "a: $a b: $b\n";
dà:
a: hello b: world
Si può vedere che gli elementi aggiuntivi vengono ignorati o persi in Perl.Questo è abbastanza facile da replicare in Python se necessario:
s = 'hello:world:sailor'
a, *b = s.split(":")
b = b[0]
print("a:", a, "b:", b)
Quindi, a, *b = s.split(":")
equivalente in Perl sarebbe
my ($a, @b) = split /:/, $s;
NB: non dovremmo usare $a
e $b
in generale Perl dal momento che hanno un significato speciale se usato con sort
. Li ho usati qui per coerenza con l'esempio di Python.
Python ha un trucco in più nella manica, siamo in grado di decomprimere a qualsiasi elemento nella tupla a sinistra:
s = "one:two:three:four"
a, *b, c = s.split(':')
print("a:", a, "b:", b, "c:", c)
Dà:
a: one b: ['two', 'three'] c: four
considerando che l'equivalente Perl, il array (@b
) è avido, e lo scalare $c
è 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";
Dà:
Use of uninitialized value $c in concatenation (.) or string at gash.pl line 8.
a: one b: two three four c:
In Perl, cosa significa '$ x' e '$ y' get se la stringa non contiene il pattern? Ad entrambi viene assegnata l'intera stringa, oppure '$ y' ottiene nulla o qualcosa? –
@ Don'tPanic: '$ x' ottiene l'intera stringa,' $ y' è 'undef' (che è simile a' None', ma leggermente differente). – cdarke
Qual è il comportamento previsto quando contengono più istanze del modello diviso? Inoltre, l'argomento pattern in Perl 'divide' una regex o una stringa regolare? – jpmc26