Оскільки ви працюєте на Python 3, це легко. PEP 3132 запросив привітальне спрощення синтаксису при призначенні кортежів - Розширене ітераційне розпакування . У минулому, при присвоєнні змінним у кортежі кількість елементів зліва від завдання повинна бути точно дорівнює кількості праворуч.
У Python 3 ми можемо позначити будь-яку змінну ліворуч як список, додавши позначку зірочкою *. Це захопить якомога більше значень, одночасно заповнюючи змінні праворуч (тому це не обов’язково повинен бути самим правим елементом). Це дозволяє уникнути багатьох неприємних зрізів, коли ми не знаємо довжини кортежу.
a, *b = "foo".split(":")
print("a:", a, "b:", b)
Дає:
a: foo b: []
РЕДАКТУЙТЕ такі коментарі та обговорення:
У порівнянні з версією Perl, це значно відрізняється, але це спосіб Python (3). У порівнянні з версією Perl, re.split()
було б більше подібним, однак виклик механізму RE для розподілу навколо одного символу є непотрібними накладними витратами.
З кількома елементами в Python:
s = 'hello:world:sailor'
a, *b = s.split(":")
print("a:", a, "b:", b)
дає:
a: hello b: ['world', 'sailor']
Однак у Perl:
my $s = 'hello:world:sailor';
my ($a, $b) = split /:/, $s;
print "a: $a b: $b\n";
дає:
a: hello b: world
Видно, що додаткові елементи ігноруються або втрачаються в Perl. Це досить легко відтворити в Python, якщо потрібно:
s = 'hello:world:sailor'
a, *b = s.split(":")
b = b[0]
print("a:", a, "b:", b)
Отже, a, *b = s.split(":")
еквівалент у Perl буде
my ($a, @b) = split /:/, $s;
Примітка: ми не повинні використовувати $a
і $b
взагалі Perl, оскільки вони мають особливе значення при використанні sort
. Я використав їх тут для узгодження з прикладом Python.
У Python є додатковий фокус в рукаві, ми можемо розпакувати будь-який елемент у кортежі зліва:
s = "one:two:three:four"
a, *b, c = s.split(':')
print("a:", a, "b:", b, "c:", c)
Дає:
a: one b: ['two', 'three'] c: four
У той час як в еквіваленті Perl, масив ( @b
) жадібний, і скаляр $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";
Дає:
Use of uninitialized value $c in concatenation (.) or string at gash.pl line 8.
a: one b: two three four c:
$x
і$y
отримувати в Perl, якщо рядок не містить шаблон? Чи їм обом присвоєно весь рядок, чи$y
нуль чи щось інше?