2016-07-29 2 views
4

У меня есть следующие:Можно ли присвоить значение по умолчанию при распаковке?

>>> myString = "has spaces" 
>>> first, second = myString.split() 
>>> myString = "doesNotHaveSpaces" 
>>> first, second = myString.split() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: need more than 1 value to unpack 

Я хотел бы иметь second значение по умолчанию для None, если строка не имеет никакого пустого пространства. Я в настоящее время имеют следующие, но мне интересно, если это может быть сделано в одной строке:

splitted = myString.split(maxsplit=1) 
first = splitted[0] 
second = splitted[1:] or None 
+0

Это невозможно, так как я знаю, потому что функция разделения писал, как это. Но вы можете использовать оператор if, например, есть ли пробел или нет в строке. – pilkington

+0

@wim - Python 3 – neverendingqs

ответ

7

Могу ли я предложить вам рассмотреть возможность использования другого метода, т.е. partition вместо split:

>>> myString = "has spaces" 
>>> left, separator, right = myString.partition(' ') 
>>> left 
'has' 
>>> myString = "doesNotHaveSpaces" 
>>> left, separator, right = myString.partition(' ') 
>>> left 
'doesNotHaveSpaces' 

Если вы на Python3, у вас есть эта опция доступна:

>>> myString = "doesNotHaveSpaces" 
>>> first, *rest = myString.split() 
>>> first 
'doesNotHaveSpaces' 
>>> rest 
[] 
0

общее решение будет chain ваш итерацию с repeat из None значения и затем использовать islice результата:

from itertools import chain, islice, repeat 

none_repat = repeat(None) 
example_iter = iter(range(1)) #or range(2) or range(0) 

first, second = islice(chain(example_iter, none_repeat), 2) 

это будет заполнить пропущенные значения с None, если вам нужен этот вид функциональности много вы можете поместить его в функцию, как это:

def fill_iter(it, size, fill_value=None): 
    return islice(chain(it, repeat(fill_value)), size) 

Несмотря на то, что наиболее часто используется для строк, поэтому str.partition существует.

-1

Вы можете попробовать это:

NUM2UNPACK=2 
parts = myString.split()  
first, second = parts+[None]*(NUM2UNPACK-(len(parts)))